forked from colonelpanic/dotfiles
Adde set-options-do-ag and supporting functions
This commit is contained in:
parent
eb61aedab9
commit
47c0ec4302
@ -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)
|
(defun imalison:check-emacs-version (major-version minor-version)
|
||||||
(funcall (imalison:emacs-version-predicate major-version minor-version)))
|
(funcall (imalison:emacs-version-predicate major-version minor-version)))
|
||||||
#+END_SRC
|
#+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
|
*** 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
|
**** Arbitrary arguments at every step
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(defun imalison:make-list (thing)
|
(defun imalison:make-list (thing)
|
||||||
@ -436,66 +501,6 @@ The packages in this section provide no functionality on their own, but provide
|
|||||||
'arg
|
'arg
|
||||||
`(funcall ,(car funcs) (imalison:compose-helper-unary ,(cdr funcs)))))
|
`(funcall ,(car funcs) (imalison:compose-helper-unary ,(cdr funcs)))))
|
||||||
#+END_SRC
|
#+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
|
||||||
Prefix alternatives is a macro that builds an interactive function
|
Prefix alternatives is a macro that builds an interactive function
|
||||||
that selects one of a collection of functions that are provided to the
|
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)
|
(imalison:named-builder imalison:prefix-alternatives)
|
||||||
#+END_SRC
|
#+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
|
*** Use Package Wrapper With Local Load Path Support
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(put 'imalison:use-package 'lisp-indent-function 1)
|
(put 'imalison:use-package 'lisp-indent-function 1)
|
||||||
@ -551,7 +565,7 @@ the ~:around~ keyword of advice-add.
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
**** Kill New
|
**** Kill New
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+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
|
#+END_SRC
|
||||||
*** Let Around
|
*** Let Around
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
@ -572,6 +586,11 @@ the ~:around~ keyword of advice-add.
|
|||||||
|
|
||||||
(imalison:named-builder imalison:dynamic-let-around)
|
(imalison:named-builder imalison:dynamic-let-around)
|
||||||
#+END_SRC
|
#+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
|
*** Let Around Advice
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(defmacro imalison:let-advise-around-fn (&rest forms)
|
(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))
|
(interactive (find-function-read))
|
||||||
(message "%s" (funcall function)))
|
(message "%s" (funcall function)))
|
||||||
#+END_SRC
|
#+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~
|
** Custom ~shell-command-on-region~
|
||||||
#+BEGIN_SRC emacs-lisp
|
#+BEGIN_SRC emacs-lisp
|
||||||
(defun imalison:copy-shell-command-on-region (start end command)
|
(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))
|
:config (helm-descbinds-mode 1))
|
||||||
|
|
||||||
(use-package helm-ag
|
(use-package helm-ag
|
||||||
:bind ("C-c p S" . imalison:set-helm-ag-extra-options)
|
:bind ("C-c p 1" . imalison:set-helm-ag-extra-options)
|
||||||
:config
|
:preface
|
||||||
(progn
|
(progn
|
||||||
(setq helm-ag-always-set-extra-option nil)
|
|
||||||
(defun imalison:set-helm-ag-extra-options ()
|
(defun imalison:set-helm-ag-extra-options ()
|
||||||
(interactive)
|
(interactive)
|
||||||
(let ((option (read-string "Extra options: " (or helm-ag--extra-options "")
|
(let ((option (read-string "Extra options: " (or helm-ag--extra-options "")
|
||||||
'helm-ag--extra-options-history)))
|
'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)))
|
(helm-mode 1)))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
[[(helm split window)][Ensure that helm buffers are started in the window that currently holds the focus]]
|
[[(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
|
||||||
projectile-find-file-other-window)
|
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)
|
(defun projectile-make-all-subdirs-projects (directory)
|
||||||
(cl-loop for file-info in (directory-files-and-attributes directory)
|
(cl-loop for file-info in (directory-files-and-attributes directory)
|
||||||
do (when (nth 1 file-info)
|
do (when (nth 1 file-info)
|
||||||
@ -1903,6 +1920,7 @@ I use helm for almost all emacs completion
|
|||||||
(shut-up (helm-projectile-on))
|
(shut-up (helm-projectile-on))
|
||||||
(diminish 'projectile-mode)
|
(diminish 'projectile-mode)
|
||||||
(bind-key* "C-c p s" 'imalison:do-ag)
|
(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)))
|
(bind-key* "C-c p f" 'imalison:projectile-find-file)))
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
*** avy
|
*** avy
|
||||||
|
Loading…
Reference in New Issue
Block a user