Adde set-options-do-ag and supporting functions

This commit is contained in:
Ivan Malison 2016-08-10 18:33:21 -07:00
parent eb61aedab9
commit 47c0ec4302
No known key found for this signature in database
GPG Key ID: 62530EFBE99DC2F8

View File

@ -403,7 +403,72 @@ The packages in this section provide no functionality on their own, but provide
(defun imalison:check-emacs-version (major-version minor-version)
(funcall (imalison:emacs-version-predicate major-version minor-version)))
#+END_SRC
*** Named Build
imalison:named-build provides a way to invoke a macro in such a way
that the lambda that it produces is given a name.
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-build (name builder &rest args)
`(defalias (quote ,name) (,builder ,@args)))
(put 'imalison:named-build 'lisp-indent-function 1)
#+END_SRC
~imalison:named-builder-builder~ builds a macro from another macro
that builds lambda functions. The arguments to the macro that results
are exactly the same as those of the original macro, except that the
first argument of the new macro is used to name the lambda produced by
the original macro (which is passed as the second argument to
~imalison:named-builder-builder~).
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-builder-builder (named-builder-name builder-name)
`(defmacro ,named-builder-name (function-name &rest args)
(cons 'imalison:named-build
(cons function-name
(cons (quote ,builder-name) args)))))
#+END_SRC
~imalison:named-builder~ runs ~imalison:named-builder-builder~ with the
convention that original macro to modify is the concatenation of the
new macro name and the -fn suffix.
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-builder (name)
`(imalison:named-builder-builder
,name ,(intern (concat (symbol-name name) "-fn"))))
#+END_SRC
*** Compose Functions
**** A version supporting macros
#+BEGIN_SRC emacs-lisp
(defun imalison:help-function-arglist (function)
(let ((result (help-function-arglist function )))
(if (eq result t) '(&rest args) result)))
(defmacro imalison:compose-fn (&rest funcs)
(let* ((last-function (car (last funcs)))
(arguments (imalison:help-function-arglist last-function))
(call-arguments (delq '&optional arguments)))
(when (memq '&rest arguments)
(setq arguments '(&rest args))
(setq call-arguments '(args)))
`(imalison:compose-argspec ,arguments ,call-arguments ,@funcs)))
(defmacro imalison:compose-argspec (arguments call-arguments &rest funcs)
"Build a new function with NAME that is the composition of FUNCS."
`(lambda ,arguments
(imalison:compose-helper ,funcs ,call-arguments)))
(defmacro imalison:compose-helper (funcs arguments)
"Builds funcalls of FUNCS applied to the arg."
(if (equal (length funcs) 1)
(let ((last-function (car funcs)))
(when (memq '&rest (imalison:help-function-arglist last-function))
(setq last-function (apply-partially 'apply last-function)))
`(,last-function ,@arguments))
`(,(car funcs)
(imalison:compose-helper ,(cdr funcs) ,arguments))))
(defmacro imalison:compose-macro-fn (&rest args)
`(cons 'macro (imalison:compose-fn ,@args)))
(imalison:named-builder imalison:compose)
(imalison:named-builder imalison:compose-macro)
#+END_SRC
**** Arbitrary arguments at every step
#+BEGIN_SRC emacs-lisp
(defun imalison:make-list (thing)
@ -436,66 +501,6 @@ The packages in this section provide no functionality on their own, but provide
'arg
`(funcall ,(car funcs) (imalison:compose-helper-unary ,(cdr funcs)))))
#+END_SRC
**** A version supporting macros
#+BEGIN_SRC emacs-lisp
(defun imalison:help-function-arglist (function)
(let ((result (help-function-arglist function )))
(if (eq result t) '(&rest args) result)))
(defmacro imalison:compose-fn (&rest funcs)
(let* ((last-function (car (last funcs)))
(arguments (imalison:help-function-arglist last-function))
(call-arguments (delq '&optional arguments)))
(when (memq '&rest arguments)
(setq arguments '(&rest args))
(setq call-arguments '(args)))
`(imalison:compose-argspec ,arguments ,call-arguments ,@funcs)))
(defmacro imalison:compose-argspec (arguments call-arguments &rest funcs)
"Build a new function with NAME that is the composition of FUNCS."
`(lambda ,arguments
(imalison:compose-helper ,funcs ,call-arguments)))
(defmacro imalison:compose-helper (funcs arguments)
"Builds funcalls of FUNCS applied to the arg."
(if (equal (length funcs) 1)
(let ((last-function (car funcs)))
(when (memq '&rest (imalison:help-function-arglist last-function))
(setq last-function (apply-partially 'apply last-function)))
`(,last-function ,@arguments))
`(,(car funcs)
(imalison:compose-helper ,(cdr funcs) ,arguments))))
(imalison:named-builder imalison:compose)
#+END_SRC
*** Named Build
imalison:named-build is a way to invoke a macro in such a way that the lambda that it produces is given a name.
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-build (name builder &rest args)
`(defalias (quote ,name) (,builder ,@args)))
(put 'imalison:named-build 'lisp-indent-function 1)
#+END_SRC
~imalison:named-builder-builder~ builds a macro from another macro
that builds lambda functions. The arguments to the macro that results
are exactly the same as those of the original macro, except that the
first argument of the new macro is used to name the lambda produced by
the original macro (which is passed as the second argument to
~imalison:named-builder-builder~).
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-builder-builder (named-builder-name builder-name)
`(defmacro ,named-builder-name (function-name &rest args)
(cons 'imalison:named-build
(cons function-name
(cons (quote ,builder-name) args)))))
#+END_SRC
~imalison:named-builder~ runs ~imalison:named-builder-builder~ with the
convention that original macro to modify is the concatenation of the
new macro name and the -fn suffix.
#+BEGIN_SRC emacs-lisp
(defmacro imalison:named-builder (name)
`(imalison:named-builder-builder
,name ,(intern (concat (symbol-name name) "-fn"))))
#+END_SRC
*** Prefix Alternatives
Prefix alternatives is a macro that builds an interactive function
that selects one of a collection of functions that are provided to the
@ -517,6 +522,15 @@ macro based on the value of the prefix argument.
(imalison:named-builder imalison:prefix-alternatives)
#+END_SRC
*** Make interactive
#+BEGIN_SRC emacs-lisp
(defmacro imalison:make-interactive-fn (function)
`(lambda (&rest args)
(interactive)
(apply ,function args)))
(imalison:named-builder imalison:make-interactive)
#+END_SRC
*** Use Package Wrapper With Local Load Path Support
#+BEGIN_SRC emacs-lisp
(put 'imalison:use-package 'lisp-indent-function 1)
@ -551,7 +565,7 @@ the ~:around~ keyword of advice-add.
#+END_SRC
**** Kill New
#+BEGIN_SRC emacs-lisp
(imalison:named-advice-add-around-builder imalison:kill-new-around kill-new)
(imalison:advice-add-around-builder imalison:kill-new-around kill-new)
#+END_SRC
*** Let Around
#+BEGIN_SRC emacs-lisp
@ -572,6 +586,11 @@ the ~:around~ keyword of advice-add.
(imalison:named-builder imalison:dynamic-let-around)
#+END_SRC
**** Interactive
#+BEGIN_SRC emacs-lisp
(defmacro imalison:let-around-interactive (name &rest args)
`(imalison:make-interactive ,name (imalison:let-around-fn ,@args)))
#+END_SRC
*** Let Around Advice
#+BEGIN_SRC emacs-lisp
(defmacro imalison:let-advise-around-fn (&rest forms)
@ -840,15 +859,6 @@ This interactive functions allows the user the select a function to invoke using
(interactive (find-function-read))
(message "%s" (funcall function)))
#+END_SRC
** Make interactive
#+BEGIN_SRC emacs-lisp
(defmacro imalison:make-interactive-fn (function)
`(lambda (&rest args)
(interactive)
(apply ,function args)))
(imalison:named-builder imalison:make-interactive)
#+END_SRC
** Custom ~shell-command-on-region~
#+BEGIN_SRC emacs-lisp
(defun imalison:copy-shell-command-on-region (start end command)
@ -1813,15 +1823,17 @@ I use helm for almost all emacs completion
:config (helm-descbinds-mode 1))
(use-package helm-ag
:bind ("C-c p S" . imalison:set-helm-ag-extra-options)
:config
(progn
(setq helm-ag-always-set-extra-option nil)
:bind ("C-c p 1" . imalison:set-helm-ag-extra-options)
:preface
(progn
(defun imalison:set-helm-ag-extra-options ()
(interactive)
(let ((option (read-string "Extra options: " (or helm-ag--extra-options "")
'helm-ag--extra-options-history)))
(setq helm-ag--extra-options option)))))
(setq helm-ag--extra-options option))))
:config
(progn
(setq helm-ag-always-set-extra-option nil)))
(helm-mode 1)))
#+END_SRC
[[(helm split window)][Ensure that helm buffers are started in the window that currently holds the focus]]
@ -1883,6 +1895,11 @@ I use helm for almost all emacs completion
projectile-find-file
projectile-find-file-other-window)
(imalison:let-around
imalison:set-options-do-ag
(lambda () (call-interactively 'imalison:do-ag))
(helm-ag-always-set-extra-option t))
(defun projectile-make-all-subdirs-projects (directory)
(cl-loop for file-info in (directory-files-and-attributes directory)
do (when (nth 1 file-info)
@ -1903,6 +1920,7 @@ I use helm for almost all emacs completion
(shut-up (helm-projectile-on))
(diminish 'projectile-mode)
(bind-key* "C-c p s" 'imalison:do-ag)
(bind-key* "C-c p S" 'imalison:set-options-do-ag)
(bind-key* "C-c p f" 'imalison:projectile-find-file)))
#+END_SRC
*** avy