unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How properly utilize the minibuffer and inactive minibuffer startup hooks?
@ 2014-07-08 20:07 Grant Rettke
  2014-07-09 22:08 ` Michael Heerdegen
  0 siblings, 1 reply; 6+ messages in thread
From: Grant Rettke @ 2014-07-08 20:07 UTC (permalink / raw)
  To: Emacs Help

Good morning,


1 My goal
═════════

  My goal is to enable [smartparens] in the minibuffer but only when
  calling `eval-expression'. That includes the inactive minibuffer. My
  attempt to do so looks like this:

  ╭────
  │ (defun gcr/smartparens-if-eval-expr ()
  │   "Enable Smartparens in the mini-buffer but only when eval'ing expressions"
  │   (if (eq this-command 'eval-expression)
  │       (turn-on-smartparens-strict-mode)))
  │
  │ (defun gcr/minibuffer-setup-hook ()
  │   "Personal setup."
  │   (local-set-key "ESC y" 'gcr/paste-from-x-clipboard)
  │   (gcr/smartparens-if-eval-expr))
  │
  │ (add-hook 'minibuffer-setup-hook 'gcr/minibuffer-setup-hook)
  │
  │ (add-hook 'minibuffer-inactive-mode-hook 'gcr/minibuffer-setup-hook)
  ╰────

  What I expected is that `smartparens' would be enabled every time I
  enter the minibuffer. The problem I am facing is that it is not.


  [smartparens] https://github.com/Fuco1/smartparens


2 Issue and questions
═════════════════════

  Instead:
  • It is only turned on inside of the minibuffer on the first call to
    `eval-expression'
  • Every call after that to `eval-expression' does not result in
      `smartparens' being enabled

  "Being enabled" means that:
  • After starting Emacs
  • After typing `M-:', entering a open round bracket, and I will see
    the right balanced bracket inserted, too.
  • While in that minibuffer, doing a `C-h m' shows the list of modes
    and Smartparen is in there. It looks like this:
    • `Show-Smartparens-Global Size-Indication Smartparens
      Smartparens-Strict'

  Following those steps, within the same Emacs session, the 2nd time
  that I try to perform those steps it is no longer true in that:
  1. Smartparens is not turned on.

  One thing that I did check for is that I am in the correct mode and
  command added in the hook this:

  ╭────
  │ (print (format "%s %s" mode-name this-command))
  ╰────

  And got what I expected 3 times:

  ╭────
  │ InactiveMinibuffer eval-expression
  ╰────

  Clearly, *I* am doing something wrong, not the modeline or
  Smartparens. I am looking for thoughts on what I am doing wrong, and
  wondering what I may do different to investigate and discover the
  nature my error since:
  • Smartparens works fine
  • Modeline works fine
  • What am I doing wrong?


3 My environment
════════════════

  My environment:

  ╭────
  │ (print (format "%s" emacs-version))
  ╰────

  ╭────
  │ =24.3.1
  │ ="
  │ \"24.3.1\"
  │ "
  ╰────

  ╭────
  │ uname -a
  ╰────

  ╭────
  │ Darwin orion 13.2.0 Darwin Kernel Version 13.2.0: Thu Apr 17
23:03:13 PDT 2014; root:xnu-2422.100.13~1/RELEASE_X86_64 x86_64
  ╰────

  Kind regards,

  gcr



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: How properly utilize the minibuffer and inactive minibuffer startup hooks?
  2014-07-08 20:07 Grant Rettke
@ 2014-07-09 22:08 ` Michael Heerdegen
  2014-07-11  0:51   ` Grant Rettke
  0 siblings, 1 reply; 6+ messages in thread
From: Michael Heerdegen @ 2014-07-09 22:08 UTC (permalink / raw)
  To: help-gnu-emacs

Hi Grant,


No, it's not your fault.

As you presumably already found out, the first time you enter a
minibuffer and minibuffer-setup-hook is run, the minibuffer is in
fundamental-mode.  The second time, however, it is in
minibuffer-inactive-mode.

`smartparens-mode` silently fails when the current major mode is in
`sp-ignore-modes-list`.  The default-value of `sp-ignore-modes-list` is
'(minibuffer-inactive-mode) -- but I don't know why the smartparens
developer decided to do so.

So, you should get it work when you remove `minibuffer-inactive-mode`
from `sp-ignore-modes-list` - at your own risk.

Adding to minibuffer-setup-hook is enough, btw, pushing your setup
function to minibuffer-inactive-mode-hook as well is not necessary.


BTW, another, maybe a bit saner, approach is to write your own
implementation of eval-expression.  This is what I use, for example:

,----------------------------------------------------------------------
| (progn
|   
|   (defvar my-read-expression-map
|     (let ((map (make-sparse-keymap)))
|       (set-keymap-parent map read-expression-map)
|       (define-key map [(control ?g)] #'minibuffer-keyboard-quit)
|       (define-key map [up]   nil)
|       (define-key map [down] nil)
|       map))
| 
|   (defun my-read--expression (prompt &optional initial-contents)
|     (let ((minibuffer-completing-symbol t))
|       (minibuffer-with-setup-hook
|           (lambda ()
|             (emacs-lisp-mode)
|             (use-local-map my-read-expression-map)
|             (setq font-lock-mode t)
|             (funcall font-lock-function 1))
|         (read-from-minibuffer prompt initial-contents
|                               my-read-expression-map nil
|                               'read-expression-history))))
| 
|   (defun my-eval-expression (expression &optional arg)
|     (interactive (list (read (my-read--expression ""))
|                        current-prefix-arg))
|     (if arg
|         (insert (pp-to-string (eval expression lexical-binding)))
|       (pp-display-expression (eval expression lexical-binding)
|                              "*Pp Eval Output*"))))
`----------------------------------------------------------------------

smartparens-mode is enabled automatically via emacs-lisp-mode.

I also want to make the R command in the debugger behave the same
way:

,----------------------------------------------------------------------
| (advice-add
|  'debugger-record-expression :around
|  (lambda (f exp) (interactive
|              (list (read (my-read--expression "Record Eval: "))))
|    (funcall f exp))
|  '((name . use-my-read--expression)))
`----------------------------------------------------------------------


HTH,

Michael.




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: How properly utilize the minibuffer and inactive minibuffer startup hooks?
       [not found] <mailman.5105.1404869933.1147.help-gnu-emacs@gnu.org>
@ 2014-07-10 12:46 ` jduthen
  2014-07-10 15:08   ` Grant Rettke
  0 siblings, 1 reply; 6+ messages in thread
From: jduthen @ 2014-07-10 12:46 UTC (permalink / raw)
  To: help-gnu-emacs

Le mardi 8 juillet 2014 22:07:59 UTC+2, Grant Rettke wrote :
> 
> 1 My goal
> ═════════
> 
>   My goal is to enable [smartparens] in the minibuffer
>   but only when calling `eval-expression'. 

If, by any chance, your goal is a subgoal of enabling smartparens 
when evaluating some lisp expressions, I would recommand to use:
M-x ielm RET

Usually, when I have to type M-: more than once
or if the expression is complexe enough to require paren matching,
I tend to use ielm.

Maybe that might help...

)jack(


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: How properly utilize the minibuffer and inactive minibuffer startup hooks?
  2014-07-10 12:46 ` How properly utilize the minibuffer and inactive minibuffer startup hooks? jduthen
@ 2014-07-10 15:08   ` Grant Rettke
  2014-07-10 16:09     ` Drew Adams
  0 siblings, 1 reply; 6+ messages in thread
From: Grant Rettke @ 2014-07-10 15:08 UTC (permalink / raw)
  To: jduthen; +Cc: Emacs Help

Good point as I'd been using eval-expression just like an IELM.
Grant Rettke | ACM, ASA, FSF, IEEE, SIAM
gcr@wisdomandwonder.com | http://www.wisdomandwonder.com/
“Wisdom begins in wonder.” --Socrates
((λ (x) (x x)) (λ (x) (x x)))
“Life has become immeasurably better since I have been forced to stop
taking it seriously.” --Thompson


On Thu, Jul 10, 2014 at 7:46 AM,  <jduthen@gmail.com> wrote:
> Le mardi 8 juillet 2014 22:07:59 UTC+2, Grant Rettke wrote :
>>
>> 1 My goal
>> ═════════
>>
>>   My goal is to enable [smartparens] in the minibuffer
>>   but only when calling `eval-expression'.
>
> If, by any chance, your goal is a subgoal of enabling smartparens
> when evaluating some lisp expressions, I would recommand to use:
> M-x ielm RET
>
> Usually, when I have to type M-: more than once
> or if the expression is complexe enough to require paren matching,
> I tend to use ielm.
>
> Maybe that might help...
>
> )jack(



^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: How properly utilize the minibuffer and inactive minibuffer startup hooks?
  2014-07-10 15:08   ` Grant Rettke
@ 2014-07-10 16:09     ` Drew Adams
  0 siblings, 0 replies; 6+ messages in thread
From: Drew Adams @ 2014-07-10 16:09 UTC (permalink / raw)
  To: Grant Rettke, jduthen; +Cc: Emacs Help

> >> 1 My goal
> >> ═════════
> >>
> >>   My goal is to enable [smartparens] in the minibuffer
> >>   but only when calling `eval-expression'.
> >
> > If, by any chance, your goal is a subgoal of enabling smartparens
> > when evaluating some lisp expressions, I would recommand to use:
> > M-x ielm RET
> >
> > Usually, when I have to type M-: more than once
> > or if the expression is complexe enough to require paren matching,
> > I tend to use ielm.
>
> Good point as I'd been using eval-expression just like an IELM.

FWIW -

1. You _can_ reasonably use the minibuffer for evaluating complex sexps.

Michael H's email answers your question in this regard.  And I would
add the suggestion to change `M-:' from `eval-expression' to
`pp-eval-expression'.  It is generally more useful to examine a
pretty-printed result (this should be the default behavior in Emacs,
IMO, but it is not).

2. Another alternative to using ielm is to just use *scratch* or an
Emacs-Lisp buffer to evaluate sexps.

3. Personally, I have `M-:' in the minibuffer bound to
`icicle-pp-eval-expression-in-minibuffer', which just calls
`icicle-pp-eval-expression from a recursive minibuffer.

And the latter command is like `pp-eval-expression' but it respects
user options `icicle-pp-eval-expression-print-length',
`icicle-pp-eval-expression-print-level', and
`eval-expression-debug-on-error'.  (If you don't use Icicles then
you can get similar behavior wrt pretty-printing from library pp+.el.)

And personally I don't bother with `smartparens-mode' (but see
Michael H's solution for that).  I use only `show-paren-mode' (and
there is no problem with that in the minibuffer).



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: How properly utilize the minibuffer and inactive minibuffer startup hooks?
  2014-07-09 22:08 ` Michael Heerdegen
@ 2014-07-11  0:51   ` Grant Rettke
  0 siblings, 0 replies; 6+ messages in thread
From: Grant Rettke @ 2014-07-11  0:51 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: Emacs Help

Thank you everyone.

Michael, that R advice looks like it is for Emacs 24.4, and I look
forward to using it.
Grant Rettke | ACM, ASA, FSF, IEEE, SIAM
gcr@wisdomandwonder.com | http://www.wisdomandwonder.com/
“Wisdom begins in wonder.” --Socrates
((λ (x) (x x)) (λ (x) (x x)))
“Life has become immeasurably better since I have been forced to stop
taking it seriously.” --Thompson


On Wed, Jul 9, 2014 at 5:08 PM, Michael Heerdegen
<michael_heerdegen@web.de> wrote:
> Hi Grant,
>
>
> No, it's not your fault.
>
> As you presumably already found out, the first time you enter a
> minibuffer and minibuffer-setup-hook is run, the minibuffer is in
> fundamental-mode.  The second time, however, it is in
> minibuffer-inactive-mode.
>
> `smartparens-mode` silently fails when the current major mode is in
> `sp-ignore-modes-list`.  The default-value of `sp-ignore-modes-list` is
> '(minibuffer-inactive-mode) -- but I don't know why the smartparens
> developer decided to do so.
>
> So, you should get it work when you remove `minibuffer-inactive-mode`
> from `sp-ignore-modes-list` - at your own risk.
>
> Adding to minibuffer-setup-hook is enough, btw, pushing your setup
> function to minibuffer-inactive-mode-hook as well is not necessary.
>
>
> BTW, another, maybe a bit saner, approach is to write your own
> implementation of eval-expression.  This is what I use, for example:
>
> ,----------------------------------------------------------------------
> | (progn
> |
> |   (defvar my-read-expression-map
> |     (let ((map (make-sparse-keymap)))
> |       (set-keymap-parent map read-expression-map)
> |       (define-key map [(control ?g)] #'minibuffer-keyboard-quit)
> |       (define-key map [up]   nil)
> |       (define-key map [down] nil)
> |       map))
> |
> |   (defun my-read--expression (prompt &optional initial-contents)
> |     (let ((minibuffer-completing-symbol t))
> |       (minibuffer-with-setup-hook
> |           (lambda ()
> |             (emacs-lisp-mode)
> |             (use-local-map my-read-expression-map)
> |             (setq font-lock-mode t)
> |             (funcall font-lock-function 1))
> |         (read-from-minibuffer prompt initial-contents
> |                               my-read-expression-map nil
> |                               'read-expression-history))))
> |
> |   (defun my-eval-expression (expression &optional arg)
> |     (interactive (list (read (my-read--expression ""))
> |                        current-prefix-arg))
> |     (if arg
> |         (insert (pp-to-string (eval expression lexical-binding)))
> |       (pp-display-expression (eval expression lexical-binding)
> |                              "*Pp Eval Output*"))))
> `----------------------------------------------------------------------
>
> smartparens-mode is enabled automatically via emacs-lisp-mode.
>
> I also want to make the R command in the debugger behave the same
> way:
>
> ,----------------------------------------------------------------------
> | (advice-add
> |  'debugger-record-expression :around
> |  (lambda (f exp) (interactive
> |              (list (read (my-read--expression "Record Eval: "))))
> |    (funcall f exp))
> |  '((name . use-my-read--expression)))
> `----------------------------------------------------------------------
>
>
> HTH,
>
> Michael.
>
>



^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-07-11  0:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <mailman.5105.1404869933.1147.help-gnu-emacs@gnu.org>
2014-07-10 12:46 ` How properly utilize the minibuffer and inactive minibuffer startup hooks? jduthen
2014-07-10 15:08   ` Grant Rettke
2014-07-10 16:09     ` Drew Adams
2014-07-08 20:07 Grant Rettke
2014-07-09 22:08 ` Michael Heerdegen
2014-07-11  0:51   ` Grant Rettke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).