unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
@ 2014-05-09 12:29 Thierry Volpiatto
  2014-05-09 13:39 ` Drew Adams
  2014-05-09 14:15 ` Stefan Monnier
  0 siblings, 2 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-09 12:29 UTC (permalink / raw)
  To: 17446


Hi,

I recently had to use `called-interactively-p-functions' to fix a
command similar to `repeat-complex-command'.
I used similar hack than the one found in `repeat-complex-command',
but as mentionned in `called-interactively-p' this is not working with
code compiled (I use lexical-binding), thus `dont-compile' have been
made obsolete.

So what to do actually to fix such issues ?

Do you plan to make something better around the terrible
`called-interactively-p' ?

What about a special var to force `called-interactively-p' to return
true when it find this var (Actually this is crashing emacs) ?

It seems the only reason `dont-compile' have been made obsolete is
to force people fixing their code to make it working compiled;
That's ok, but what to do when nothing else is possible ?
IOW why is this obsolete ?


Ref: https://github.com/emacs-helm/helm/issues/489

Thanks.




In GNU Emacs 24.4.50.1 (x86_64-unknown-linux-gnu, GTK+ Version 3.10.8)
 of 2014-05-04 on dell-14z
Windowing system distributor `The X.Org Foundation', version 11.0.11501000
System Description:	Ubuntu 14.04 LTS

Configured features:
XPM JPEG TIFF GIF PNG RSVG IMAGEMAGICK SOUND GPM DBUS GCONF GSETTINGS
NOTIFY LIBSELINUX GNUTLS LIBXML2 FREETYPE M17N_FLT LIBOTF XFT ZLIB

Important settings:
  value of $LANG: fr_FR.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Emacs-Lisp

Minor modes in effect:
  diff-auto-refine-mode: t
  git-gutter-mode: t
  psession-mode: t
  golden-ratio-mode: t
  global-semanticdb-minor-mode: t
  global-semantic-idle-scheduler-mode: t
  semantic-idle-scheduler-mode: t
  semantic-mode: t
  winner-mode: t
  global-undo-tree-mode: t
  undo-tree-mode: t
  auto-image-file-mode: t
  eldoc-in-minibuffer-mode: t
  show-paren-mode: t
  display-time-mode: t
  recentf-mode: t
  savehist-mode: t
  eldoc-mode: t
  minibuffer-depth-indicate-mode: t
  helm-mode: t
  helm-descbinds-mode: t
  shell-dirtrack-mode: t
  helm-adaptative-mode: t
  helm-match-plugin-mode: t
  helm-occur-match-plugin-mode: t
  tooltip-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  column-number-mode: t
  line-number-mode: t
  transient-mark-mode: t

Recent input:
C-x C-b e l i s <down> <return> C-x C-d C-e b v <down> 
<return> m m <down> <down> <down> <return> C-c C-c 
q P P q <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <down> <down> <down> <down> <down> <down> <down> 
<down> <up> <up> <up> <up> <up> <up> <up> <up> <up> 
<up> <up> <up> <up> <up> <up> <up> <up> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> <right> 
<right> <right> <right> <right> <right> <right> C-M-SPC 
M-w C-x C-f <left> <left> e m a <left> l s p C-u C-s 
<return> M-n <down> <up> <return> C-x C-f C-g M-> C-c 
SPC <return> M-x r e p o r t <return>

Recent messages:
Parsing helm-elisp.el (LL)...done
Parsing helm.el (LL)...done
Type a prefix key to toggle it. Run 'actions' with their prefixes. '?' for more help.
Type C-c C-c to commit (C-c C-k to cancel).
Parsing helm.el (LL)...done
git finished.
Type a prefix key to toggle it. Run 'actions' with their prefixes. '?' for more help.
Running git push -v origin complex-command-history:refs/heads/complex-command-history
git finished.
Mark set [2 times]

Load-path shadows:
~/elisp/auctex/lpath hides ~/elisp/emacs-wget/lpath
/usr/local/share/emacs/24.4.50/lisp/emacs-lisp/tq hides ~/elisp/emms/lisp/tq

Features:
(shadow epa-mail mule-util emacsbug helm-command helm-ring
semantic/tag-write magit-cherry magit-bisect magit-log-edit log-edit
add-log magit-key-mode magit magit-version view ediff-merg ediff-wind
ediff-diff ediff-mult ediff-help ediff-init ediff-util ediff diff-mode
magit-compat semantic/decorate/mode semantic/decorate pulse nxml-uchnm
rng-xsd xsd-regexp rng-cmpct rng-nxml rng-valid rng-loc rng-uri
rng-parse nxml-parse rng-match rng-dt rng-util rng-pttrn nxml-ns
nxml-mode nxml-outln nxml-rap nxml-util nxml-glyph nxml-enc xmltok
semantic/wisent/javascript-jv semantic/wisent/js-wy semantic/wisent
semantic/wisent/wisent semantic/java semantic/doc js json moz imenu
cc-mode cc-fonts cc-guess cc-menus cc-cmds cc-styles cc-align cc-engine
cc-vars cc-defs vc-rcs conf-mode sh-script smie executable vc-git
semantic/db-find naquadah-theme em-unix em-script em-prompt em-ls
em-hist em-pred em-glob em-dirs em-cmpl em-basic em-banner em-alias
semantic/db-ref semantic/db-file data-debug cedet-files align-let
git-gutter server psession golden-ratio semantic/bovine/el
semantic/db-el eieio-opt help-mode semantic/bovine semantic/db-mode
semantic/db eieio-base semantic/idle semantic/format semantic/tag-ls
semantic/find semantic/ctxt semantic/util-modes semantic/util semantic
semantic/tag semantic/lex semantic/fw mode-local cedet winner undo-tree
diff image-file newsticker newst-treeview newst-plainview newst-reader
newst-ticker newst-backend xdvi-search preview-latex tex-site auto-loads
pcomplete-extension em-term term disp-table ehelp helm-ipython
helm-elisp helm-eval python eldoc-eval warnings whitespace paren time
avoid recentf tree-widget savehist mu4e-config org-mu4e helm-mu
mu4e-contrib mu4e mu4e-speedbar speedbar sb-image ezimage dframe
mu4e-main mu4e-view mu4e-headers mu4e-compose mu4e-draft mu4e-actions
ido rfc2368 mu4e-mark mu4e-message html2text mu4e-proc mu4e-utils
mu4e-lists mu4e-about mu4e-vars mu4e-meta gnus-dired nnir gnus-sum
gnus-group gnus-undo gnus-start gnus-cloud nnimap nnmail mail-source tls
utf7 netrc parse-time gnus-spec gnus-int gnus-range gnus-win nnoo
config-w3m w3m-search w3m timezone w3m-hist w3m-fb bookmark-w3m w3m-ems
w3m-ccl ccl w3m-favicon w3m-image w3m-proc w3m-util w3m-load
smtpmail-async smtpmail sendmail dired-async iterator simple-call-tree
iedit-rect iedit iedit-lib smallurl mm-url gnus gnus-ems nnheader
wid-edit rectangle-utils rect ledger-config ledger esh-var esh-io
esh-cmd esh-opt esh-ext esh-proc eldoc esh-groups eshell esh-module
esh-mode esh-arg esh-util tv-utils async pcvs vc-cvs pcvs-parse
pcvs-info pcvs-defs pcvs-util ewoc mb-depth cl-info slime-autoloads
esh-toggle flymake no-word htmlize cl dired-extension emms-mpd-config
emms-playlist-limit emms-volume emms-volume-amixer emms-i18n
emms-history emms-score emms-stream-info emms-metaplaylist-mode
emms-bookmarks emms-cue emms-mode-line-icon emms-browser sort
emms-playlist-sort emms-last-played emms-player-xine emms-player-mpd tq
emms-playing-time emms-lyrics emms-url hl-line emms-tag-editor emms-mark
emms-mode-line emms-cache emms-info-ogginfo emms-info-mp3info
emms-playlist-mode emms-player-vlc emms-player-mplayer emms-info
emms-streams later-do emms-source-playlist emms-source-file
emms-player-simple emms-setup emms emms-compat org-config-thierry ob-sh
org-crypt cal-china lunar solar cal-dst cal-bahai cal-islam cal-hebrew
holidays hol-loaddefs appt diary-lib diary-loaddefs org-element
org-rmail org-mhe org-irc org-info org-gnus org-docview doc-view
jka-compr image-mode org-bibtex bibtex org-bbdb org-w3m org-agenda
org-annotation-helper addressbook-bookmark message rfc822 mml mml-sec
mm-decode mm-bodies mm-encode mail-parse rfc2231 rfc2047 rfc2045
ietf-drums mailabbrev mail-utils gmm-utils mailheader firefox-protocol
bookmark-firefox-handler bookmark-extensions org org-macro org-footnote
org-pcomplete org-list org-faces org-entities noutline outline
easy-mmode org-version ob-emacs-lisp ob ob-tangle org-src ob-ref ob-lob
ob-table ob-keys ob-exp ob-comint ob-core ob-eval org-compat org-macs
org-loaddefs find-func cal-menu calendar cal-loaddefs init-helm-thierry
helm-mode helm-dictionary helm-ls-git helm-descbinds helm-ls-hg
helm-files image-dired tramp tramp-compat tramp-loaddefs trampver shell
pcomplete format-spec dired-x dired-aux ffap thingatpt helm-buffers
helm-elscreen helm-tags helm-bookmark helm-adaptative helm-info helm-net
browse-url xml url url-proxy url-privacy url-expand url-methods
url-history url-cookie url-domsuf url-util url-parse url-vars mailcap
helm-plugin bookmark pp helm-help helm-match-plugin helm-grep wgrep-helm
wgrep helm-regexp grep helm-external helm-utils dired compile comint
ansi-color ring helm-locate helm vc vc-dispatcher helm-config
helm-aliases epa-file epa derived epg epg-config auth-source eieio
byte-opt bytecomp byte-compile cconv eieio-core gnus-util time-date
mm-util mail-prsvr password-cache package info easymenu cl-macs gv
edmacro kmacro advice help-fns net-utils cl-loaddefs cl-lib tooltip
electric uniquify ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd
tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment
lisp-mode prog-mode register page menu-bar rfn-eshadow timer select
scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cham
georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese hebrew greek romanian slovak czech european ethiopic
indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple
abbrev minibuffer nadvice loaddefs button faces cus-face macroexp files
text-properties overlay sha1 md5 base64 format env code-pages mule
custom widget hashtable-print-readable backquote make-network-process
dbusbind gfilenotify dynamic-setting system-font-setting
font-render-setting move-toolbar gtk x-toolkit x multi-tty emacs)

Memory information:
((conses 16 638475 69033)
 (symbols 48 61289 0)
 (miscs 40 18406 905)
 (strings 32 169566 15566)
 (string-bytes 1 5184981)
 (vectors 16 59750)
 (vector-slots 8 972179 36494)
 (floats 8 2237 544)
 (intervals 56 3036 23)
 (buffers 960 108)
 (heap 1024 62643 2998))
-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 12:29 bug#17446: 24.4.50; What is the situation around `called-interactively-p'? Thierry Volpiatto
@ 2014-05-09 13:39 ` Drew Adams
  2014-05-09 14:11   ` Michael Heerdegen
  2014-05-09 14:17   ` Drew Adams
  2014-05-09 14:15 ` Stefan Monnier
  1 sibling, 2 replies; 37+ messages in thread
From: Drew Adams @ 2014-05-09 13:39 UTC (permalink / raw)
  To: Thierry Volpiatto, 17446

> I recently had to use `called-interactively-p-functions' to fix a
> command similar to `repeat-complex-command'.
> I used similar hack than the one found in `repeat-complex-command',
> but as mentionned in `called-interactively-p' this is not working with
> code compiled (I use lexical-binding), thus `dont-compile' have been
> made obsolete.
> 
> So what to do actually to fix such issues ?
> 
> Do you plan to make something better around the terrible
> `called-interactively-p' ?
> 
> What about a special var to force `called-interactively-p' to return
> true when it find this var (Actually this is crashing emacs) ?
> 
> It seems the only reason `dont-compile' have been made obsolete is
> to force people fixing their code to make it working compiled;
> That's ok, but what to do when nothing else is possible ?
> IOW why is this obsolete ?
> 
> Ref: https://github.com/emacs-helm/helm/issues/489

FWIW (I think this is related; apologies if not), this is what
I did:

;; Same as `repeat-complex-command--called-interactively-skip'
;; in `simple.el', but tests for `icicle-repeat-complex-command',
;; not `repeat-complex-command'.
(when (> emacs-major-version 23)

  (defun icicle-repeat-complex-command--called-interactively-skip
         (i _frame1 frame2)
    "If currently `icicle-repeat-complex-command', return 1 to skip over it."
    (and (eq 'eval (cadr frame2))
         (eq 'icicle-repeat-complex-command
             (cadr (backtrace-frame i #'called-interactively-p)))
         1))

  (byte-compile 'icicle-repeat-complex-command))

The reason for the `byte-compile' is that I found that it does
not work when interpreted.  (That seems opposite to what you are
saying (?).  I do not have non-nil `lexical-binding', however.)

I agree that this all seems complicated & fragile.  Dunno what
the solution is.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 13:39 ` Drew Adams
@ 2014-05-09 14:11   ` Michael Heerdegen
  2014-05-09 14:47     ` Drew Adams
  2014-05-09 14:17   ` Drew Adams
  1 sibling, 1 reply; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-09 14:11 UTC (permalink / raw)
  To: Drew Adams; +Cc: 17446, Thierry Volpiatto

Drew Adams <drew.adams@oracle.com> writes:

> I agree that this all seems complicated & fragile.  Dunno what
> the solution is.

Useful for packages like Icicles and Helm would be a build in

  (defun fake-interactive-call (command &rest args) ...)

factored out of what is now hidden inside `repeat-complex-command'.

Michael.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 12:29 bug#17446: 24.4.50; What is the situation around `called-interactively-p'? Thierry Volpiatto
  2014-05-09 13:39 ` Drew Adams
@ 2014-05-09 14:15 ` Stefan Monnier
  2014-05-09 14:28   ` Drew Adams
  1 sibling, 1 reply; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 14:15 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: 17446

> but as mentionned in `called-interactively-p' this is not working with
> code compiled (I use lexical-binding),

I don't know which "mention" you're thinking of here.
`called-interactively-p' is supposed to work (more or less as
well/poorly) in compiled code.

> thus `dont-compile' have been made obsolete.

It's not related.

> So what to do actually to fix such issues ?

Use an additional argument (you can call it `interactive'), provided by
the `interactive' spec?

> Do you plan to make something better around the terrible
> `called-interactively-p' ?

We have that already: the extra arg, as suggested in C-h
f called-interactively-p.

> It seems the only reason `dont-compile' have been made obsolete is
> to force people fixing their code to make it working compiled;

It's obsolete for the following reasons:
- I don't know of any use for it.
- I haven't seen a use of it yet.
- It seems to only make sense for ugly hacks.

> That's ok, but what to do when nothing else is possible ?

AFAIK something else is always possible and preferable.  But I don't
know enough about your problem to know that it's indeed also the case in
your situation.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 13:39 ` Drew Adams
  2014-05-09 14:11   ` Michael Heerdegen
@ 2014-05-09 14:17   ` Drew Adams
  1 sibling, 0 replies; 37+ messages in thread
From: Drew Adams @ 2014-05-09 14:17 UTC (permalink / raw)
  To: Thierry Volpiatto, 17446

> this is what I did:
>   (defun icicle-repeat-complex-command--called-interactively-skip
    ...

Plus this code in `icicle-repeat-complex-command':
(if (> emacs-major-version 23)
    (unwind-protect
         (progn
          (add-hook
            'called-interactively-p-functions
            #'icicle-repeat-complex-command--called-interactively-skip)
          (eval newcmd))
      (remove-hook
       'called-interactively-p-functions
       #'icicle-repeat-complex-command--called-interactively-skip))
  (eval newcmd))





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 14:15 ` Stefan Monnier
@ 2014-05-09 14:28   ` Drew Adams
  2014-05-09 14:50     ` Stefan Monnier
  0 siblings, 1 reply; 37+ messages in thread
From: Drew Adams @ 2014-05-09 14:28 UTC (permalink / raw)
  To: Stefan Monnier, Thierry Volpiatto; +Cc: 17446

> > So what to do actually to fix such issues ?
> 
> Use an additional argument (you can call it `interactive'),
> provided by the `interactive' spec?
> 
> > Do you plan to make something better around the terrible
> > `called-interactively-p' ?
> 
> We have that already: the extra arg, as suggested in C-h
> f called-interactively-p.

Sure, we already do that.  But that doesn't help when you define
a "command similar to `repeat-complex-command'", as Thierry says,
and as I have done too.  Such a command has little control over
the definition of the command that it invokes.

> > That's ok, but what to do when nothing else is possible ?
> 
> AFAIK something else is always possible and preferable.  But I don't
> know enough about your problem to know that it's indeed also the case in
> your situation.

I thought he described it pretty well.  Write a command that is
similar to `repeat-complex-command'.  Now make it work-around Emacs
bug #14136.

You end up doing for your new command something like what Emacs
does for `repeat-complex-command'.  And AFAICT, that works only
when the helper function (similar to vanilla Emacs function
`repeat-complex-command--called-interactively-skip') is
byte-compiled.






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 14:11   ` Michael Heerdegen
@ 2014-05-09 14:47     ` Drew Adams
  0 siblings, 0 replies; 37+ messages in thread
From: Drew Adams @ 2014-05-09 14:47 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 17446, Thierry Volpiatto

> > I agree that this all seems complicated & fragile.  Dunno what
> > the solution is.
> 
> Useful for packages like Icicles and Helm would be a build in
>   (defun fake-interactive-call (command &rest args) ...)
> factored out of what is now hidden inside `repeat-complex-command'.

Yes.  Or even a standard helper command, a la
`repeat-complex-command--called-interactively-skip', which
provides a way (e.g. a variable) to specify the replacement for `repeat-complex-command'.

IOW, it's a bit silly for libraries to essentially duplicate the
ugly hack used in `repeat-complex-command', specifying their own
command in place of it.

If this hack is the best Emacs can do then we should do it just
once and let other commands that are similar to
`repeat-complex-command' make use of it without just duplicating it.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 14:28   ` Drew Adams
@ 2014-05-09 14:50     ` Stefan Monnier
  2014-05-09 14:55       ` Drew Adams
  0 siblings, 1 reply; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 14:50 UTC (permalink / raw)
  To: Drew Adams; +Cc: 17446, Thierry Volpiatto

> You end up doing for your new command something like what Emacs
> does for `repeat-complex-command'.

Yes.

> And AFAICT, that works only
> when the helper function (similar to vanilla Emacs function
> `repeat-complex-command--called-interactively-skip') is
> byte-compiled.

Ah, now I understand the "byte-compiled" part (I kept thinking it was
about whether the command (i.e. callee) is byte-compiled).

> Useful for packages like Icicles and Helm would be a build in
>   (defun fake-interactive-call (command &rest args) ...)
> factored out of what is now hidden inside `repeat-complex-command'.

Yes, that makes a lot of sense now.

Before we go about doing that, I'd want to know one more thing: how did
icicles and helm does with it, in previous versions of Emacs?


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 14:50     ` Stefan Monnier
@ 2014-05-09 14:55       ` Drew Adams
  2014-05-09 15:15         ` Michael Heerdegen
  0 siblings, 1 reply; 37+ messages in thread
From: Drew Adams @ 2014-05-09 14:55 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446, Thierry Volpiatto

> Before we go about doing that, I'd want to know one more thing: how did
> icicles and helm does with it, in previous versions of Emacs?

Icicles did nothing - the bug existed, just as in vanilla Emacs.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 14:55       ` Drew Adams
@ 2014-05-09 15:15         ` Michael Heerdegen
  2014-05-09 17:53           ` Stefan Monnier
  0 siblings, 1 reply; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-09 15:15 UTC (permalink / raw)
  To: Drew Adams; +Cc: 17446, Thierry Volpiatto

Drew Adams <drew.adams@oracle.com> writes:

> > Before we go about doing that, I'd want to know one more thing: how did
> > icicles and helm does with it, in previous versions of Emacs?
>
> Icicles did nothing - the bug existed, just as in vanilla Emacs.

It was the same with helm.

Michael.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 15:15         ` Michael Heerdegen
@ 2014-05-09 17:53           ` Stefan Monnier
  2014-05-09 18:47             ` Thierry Volpiatto
  2014-05-09 19:16             ` Drew Adams
  0 siblings, 2 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 17:53 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 17446, Thierry Volpiatto

>> > Before we go about doing that, I'd want to know one more thing: how did
>> > icicles and helm does with it, in previous versions of Emacs?
>> Icicles did nothing - the bug existed, just as in vanilla Emacs.

In which sense did it exist in vanilla Emacs?

> It was the same with helm.

IOW, this is a long standing problem, for which
called-interactively-p-functions provides a limited workaround?


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 17:53           ` Stefan Monnier
@ 2014-05-09 18:47             ` Thierry Volpiatto
  2014-05-09 19:50               ` Stefan Monnier
  2014-05-09 19:16             ` Drew Adams
  1 sibling, 1 reply; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-09 18:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

>>> > Before we go about doing that, I'd want to know one more thing: how did
>>> > icicles and helm does with it, in previous versions of Emacs?
>>> Icicles did nothing - the bug existed, just as in vanilla Emacs.
>
> In which sense did it exist in vanilla Emacs?

(eval (count-words nil nil))
=> eval: Wrong type argument: integer-or-marker-p, nil

We were using a condition-case returning an error message in such cases.

See

https://lists.gnu.org/archive/html/emacs-bug-tracker/2013-08/msg00161.html

>> It was the same with helm.
>
> IOW, this is a long standing problem, for which
> called-interactively-p-functions provides a limited workaround?

Yes, seems fragile too.

Another approch would be to allow more args to `call-interactively',
this would allow one to use:

(apply 'call-interactively '(sexp arg1 arg2 arg...))

But not sure this would cover all use cases.

-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 17:53           ` Stefan Monnier
  2014-05-09 18:47             ` Thierry Volpiatto
@ 2014-05-09 19:16             ` Drew Adams
  1 sibling, 0 replies; 37+ messages in thread
From: Drew Adams @ 2014-05-09 19:16 UTC (permalink / raw)
  To: Stefan Monnier, Michael Heerdegen; +Cc: 17446, Thierry Volpiatto

> >> the bug existed, just as in vanilla Emacs.
> 
> In which sense did it exist in vanilla Emacs?

I assume Michael was referring to Emacs bug #14136.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 18:47             ` Thierry Volpiatto
@ 2014-05-09 19:50               ` Stefan Monnier
  2014-05-09 21:02                 ` Stefan Monnier
                                   ` (2 more replies)
  0 siblings, 3 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 19:50 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> Another approch would be to allow more args to `call-interactively',
> this would allow one to use:

> (apply 'call-interactively '(sexp arg1 arg2 arg...))

> But not sure this would cover all use cases.

Right, I'm thinking of introducing a new `funcall-interactively' which
is just like `funcall' except that the called function will see its
`called-interactively-p' returning non-nil.

But I think this will have to wait for 24.5.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 19:50               ` Stefan Monnier
@ 2014-05-09 21:02                 ` Stefan Monnier
  2014-05-09 22:39                   ` Stefan Monnier
  2014-05-10  5:51                   ` Thierry Volpiatto
  2014-05-10  3:43                 ` Thierry Volpiatto
  2017-03-25  6:23                 ` npostavs
  2 siblings, 2 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 21:02 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> Right, I'm thinking of introducing a new `funcall-interactively' which
> is just like `funcall' except that the called function will see its
> `called-interactively-p' returning non-nil.

How 'bout the patch below,


        Stefan


=== modified file 'lisp/simple.el'
--- lisp/simple.el	2014-05-01 23:25:28 +0000
+++ lisp/simple.el	2014-05-09 20:42:04 +0000
@@ -1503,24 +1503,13 @@
 	  ;; add it to the history.
 	  (or (equal newcmd (car command-history))
 	      (setq command-history (cons newcmd command-history)))
-          (unwind-protect
-              (progn
-                ;; Trick called-interactively-p into thinking that `newcmd' is
-                ;; an interactive call (bug#14136).
-                (add-hook 'called-interactively-p-functions
-                          #'repeat-complex-command--called-interactively-skip)
-                (eval newcmd))
-            (remove-hook 'called-interactively-p-functions
-                         #'repeat-complex-command--called-interactively-skip)))
+          (apply #'funcall-interactively
+		 (car newcmd)
+		 (mapcar (lambda (e) (eval e t)) (cdr newcmd))))
       (if command-history
 	  (error "Argument %d is beyond length of command history" arg)
 	(error "There are no previous complex commands to repeat")))))
 
-(defun repeat-complex-command--called-interactively-skip (i _frame1 frame2)
-  (and (eq 'eval (cadr frame2))
-       (eq 'repeat-complex-command
-           (cadr (backtrace-frame i #'called-interactively-p)))
-       1))
 
 (defvar extended-command-history nil)
 

=== modified file 'lisp/subr.el'
--- lisp/subr.el	2014-04-09 01:48:07 +0000
+++ lisp/subr.el	2014-05-09 20:24:34 +0000
@@ -3832,7 +3832,8 @@
 	    (byte-compile-log-warning msg))
 	(run-with-timer 0 nil
 			(lambda (msg)
-			  (message "%s" msg)) msg))))
+			  (message "%s" msg))
+                        msg))))
 
   ;; Finally, run any other hook.
   (run-hook-with-args 'after-load-functions abs-file))
@@ -4149,7 +4150,8 @@
 if those frames don't seem special and otherwise, it should return
 the number of frames to skip (minus 1).")
 
-(defconst internal--call-interactively (symbol-function 'call-interactively))
+(defconst internal--funcall-interactively
+  (symbol-function 'funcall-interactively))
 
 (defun called-interactively-p (&optional kind)
   "Return t if the containing function was called by `call-interactively'.
@@ -4225,8 +4227,8 @@
         (`((,_ ,(pred (lambda (f) (subrp (indirect-function f)))) . ,_) . ,_) nil)
         ;; In case #<subr call-interactively> without going through the
         ;; `call-interactively' symbol (bug#3984).
-        (`(,_ . (t ,(pred (eq internal--call-interactively)) . ,_)) t)
-        (`(,_ . (t call-interactively . ,_)) t)))))
+        (`(,_ . (t ,(pred (eq internal--funcall-interactively)) . ,_)) t)
+        (`(,_ . (t funcall-interactively . ,_)) t)))))
 
 (defun interactive-p ()
   "Return t if the containing function was run directly by user input.

=== modified file 'src/callint.c'
--- src/callint.c	2014-04-22 07:04:34 +0000
+++ src/callint.c	2014-05-09 20:47:17 +0000
@@ -29,7 +29,7 @@
 #include "keymap.h"
 
 Lisp_Object Qminus, Qplus;
-static Lisp_Object Qcall_interactively;
+static Lisp_Object Qfuncall_interactively;
 static Lisp_Object Qcommand_debug_status;
 static Lisp_Object Qenable_recursive_minibuffers;
 
@@ -233,6 +233,22 @@
     }
 }
 
+/* BEWARE: Calling this directly from C would defeat the purpose!  */
+DEFUN ("funcall-interactively", Ffuncall_interactively, Sfuncall_interactively,
+       1, MANY, 0, doc: /* Like `funcall' but marks the call as interactive.
+I.e. arrange that within the called function `called-interactively-p' will
+return non-nil.  */)
+     (ptrdiff_t nargs, Lisp_Object *args)
+{
+  ptrdiff_t speccount = SPECPDL_INDEX ();
+  temporarily_switch_to_single_kboard (NULL);
+  
+  /* Nothing special to do here, all the work is inside
+     `called-interactively-p'.  Which will look for us as a marker in the
+     backtrace.  */
+  return unbind_to (speccount, Ffuncall (nargs, args));
+}
+
 DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0,
        doc: /* Call FUNCTION, providing args according to its interactive calling specs.
 Return the value FUNCTION returns.
@@ -374,8 +390,13 @@
       Vreal_this_command = save_real_this_command;
       kset_last_command (current_kboard, save_last_command);
 
-      temporarily_switch_to_single_kboard (NULL);
-      return unbind_to (speccount, apply1 (function, specs));
+      {
+	Lisp_Object args[3];
+	args[0] = Qfuncall_interactively;
+	args[1] = function;
+	args[2] = specs;
+	return unbind_to (speccount, Fapply (3, args));
+      }
     }
 
   /* Here if function specifies a string to control parsing the defaults.  */
@@ -446,10 +467,11 @@
       else break;
     }
 
-  /* Count the number of arguments, which is one plus the number of arguments
-     the interactive spec would have us give to the function.  */
+  /* Count the number of arguments, which is two (the function itself and
+     `funcall-interactively') plus the number of arguments the interactive spec
+     would have us give to the function.  */
   tem = string;
-  for (nargs = 1; *tem; )
+  for (nargs = 2; *tem; )
     {
       /* 'r' specifications ("point and mark as 2 numeric args")
 	 produce *two* arguments.  */
@@ -488,13 +510,13 @@
     specbind (Qenable_recursive_minibuffers, Qt);
 
   tem = string;
-  for (i = 1; *tem; i++)
+  for (i = 2; *tem; i++)
     {
-      visargs[0] = make_string (tem + 1, strcspn (tem + 1, "\n"));
-      if (strchr (SSDATA (visargs[0]), '%'))
+      visargs[1] = make_string (tem + 1, strcspn (tem + 1, "\n"));
+      if (strchr (SSDATA (visargs[1]), '%'))
 	callint_message = Fformat (i, visargs);
       else
-	callint_message = visargs[0];
+	callint_message = visargs[1];
 
       switch (*tem)
 	{
@@ -789,21 +811,22 @@
 
   QUIT;
 
-  args[0] = function;
+  args[0] = Qfuncall_interactively;
+  args[1] = function;
 
   if (arg_from_tty || !NILP (record_flag))
     {
       /* We don't need `visargs' any more, so let's recycle it since we need
 	 an array of just the same size.  */
-      visargs[0] = function;
-      for (i = 1; i < nargs; i++)
+      visargs[1] = function;
+      for (i = 2; i < nargs; i++)
 	{
 	  if (varies[i] > 0)
 	    visargs[i] = list1 (intern (callint_argfuns[varies[i]]));
 	  else
 	    visargs[i] = quotify_arg (args[i]);
 	}
-      Vcommand_history = Fcons (Flist (nargs, visargs),
+      Vcommand_history = Fcons (Flist (nargs - 1, visargs + 1),
 				Vcommand_history);
       /* Don't keep command history around forever.  */
       if (INTEGERP (Vhistory_length) && XINT (Vhistory_length) > 0)
@@ -816,7 +839,7 @@
 
   /* If we used a marker to hold point, mark, or an end of the region,
      temporarily, convert it to an integer now.  */
-  for (i = 1; i < nargs; i++)
+  for (i = 2; i < nargs; i++)
     if (varies[i] >= 1 && varies[i] <= 4)
       XSETINT (args[i], marker_position (args[i]));
 
@@ -829,11 +852,7 @@
   kset_last_command (current_kboard, save_last_command);
 
   {
-    Lisp_Object val;
-    specbind (Qcommand_debug_status, Qnil);
-
-    temporarily_switch_to_single_kboard (NULL);
-    val = Ffuncall (nargs, args);
+    Lisp_Object val = Ffuncall (nargs, args);
     UNGCPRO;
     return unbind_to (speccount, val);
   }
@@ -888,7 +907,7 @@
   DEFSYM (Qplus, "+");
   DEFSYM (Qhandle_shift_selection, "handle-shift-selection");
   DEFSYM (Qread_number, "read-number");
-  DEFSYM (Qcall_interactively, "call-interactively");
+  DEFSYM (Qfuncall_interactively, "funcall-interactively");
   DEFSYM (Qcommand_debug_status, "command-debug-status");
   DEFSYM (Qenable_recursive_minibuffers, "enable-recursive-minibuffers");
   DEFSYM (Qmouse_leave_buffer_hook, "mouse-leave-buffer-hook");
@@ -946,5 +965,6 @@
 
   defsubr (&Sinteractive);
   defsubr (&Scall_interactively);
+  defsubr (&Sfuncall_interactively);
   defsubr (&Sprefix_numeric_value);
 }






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 21:02                 ` Stefan Monnier
@ 2014-05-09 22:39                   ` Stefan Monnier
  2014-05-09 23:34                     ` Drew Adams
                                       ` (2 more replies)
  2014-05-10  5:51                   ` Thierry Volpiatto
  1 sibling, 3 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-09 22:39 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> How 'bout the patch below,

BTW, for older Emacsen, you can probably use a hack along the lines of
the guaranteed 100% untested code below:

   (defun funcall-interactively (fun &rest args)
     (call-interactively
       (cond
        ((consp fun)
         (mapcar (lambda (x)
                   (if (eq (car-safe x) 'interactive))
                     `(interactive ',args) x)
                 fun))
        ((byte-code-function-p)
         (apply #'make-byte-code
                (aref 0 fun)
                (aref 1 fun)
                (aref 2 fun)
                (aref 3 fun)
                (aref 4 fun)
                `',args)))))

-- Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 22:39                   ` Stefan Monnier
@ 2014-05-09 23:34                     ` Drew Adams
  2014-05-10  2:13                       ` Stefan Monnier
  2014-05-10  9:10                       ` Thierry Volpiatto
  2014-05-10  6:12                     ` Thierry Volpiatto
  2014-05-10  7:40                     ` Michael Heerdegen
  2 siblings, 2 replies; 37+ messages in thread
From: Drew Adams @ 2014-05-09 23:34 UTC (permalink / raw)
  To: Stefan Monnier, Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> > How 'bout the patch below,
> BTW, for older Emacsen, you can probably use a hack along the lines of
> the guaranteed 100% untested code below:

Not sure I understand how any of this will help the use cases we
mentioned.  Is the idea that `repeat-complex-command' will, instead
of doing (eval newcmd), do something like this?

 (eval `(funcall-interactively ,(car newcmd) ,@(cdr newcmd)))

For the case in bug #14136, where NEWCMD is (count-words nil nil),
this would mean (funcall-interactively 'count-words nil nil).

(Maybe an `apply-interactively' would be handier here?)

In any case, I will wait to see how this changes the
`repeat-complex-command' code and then do likewise for my code,
which is similar.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 23:34                     ` Drew Adams
@ 2014-05-10  2:13                       ` Stefan Monnier
  2014-05-10  9:10                       ` Thierry Volpiatto
  1 sibling, 0 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-10  2:13 UTC (permalink / raw)
  To: Drew Adams; +Cc: Michael Heerdegen, 17446, Thierry Volpiatto

> In any case, I will wait to see how this changes the
> `repeat-complex-command' code and then do likewise for my code,
> which is similar.

Go back 2 steps.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 19:50               ` Stefan Monnier
  2014-05-09 21:02                 ` Stefan Monnier
@ 2014-05-10  3:43                 ` Thierry Volpiatto
  2017-03-25  6:23                 ` npostavs
  2 siblings, 0 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  3:43 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

> Right, I'm thinking of introducing a new `funcall-interactively' which
> is just like `funcall' except that the called function will see its
> `called-interactively-p' returning non-nil.

That's good news, great, thanks.


-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 21:02                 ` Stefan Monnier
  2014-05-09 22:39                   ` Stefan Monnier
@ 2014-05-10  5:51                   ` Thierry Volpiatto
  2014-05-10  6:45                     ` Stefan Monnier
  1 sibling, 1 reply; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  5:51 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> Right, I'm thinking of introducing a new `funcall-interactively' which
>> is just like `funcall' except that the called function will see its
>> `called-interactively-p' returning non-nil.
>
> How 'bout the patch below,

Just applied and tried, it is working fine, thanks.

However:

> +          (apply #'funcall-interactively
> +		 (car newcmd)
> +		 (mapcar (lambda (e) (eval e t)) (cdr newcmd))))

Is this needed ?

Looks like 

(apply #'funcall-interactively (car newcmd) (cdr newcmd))

is enough no ?

-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 22:39                   ` Stefan Monnier
  2014-05-09 23:34                     ` Drew Adams
@ 2014-05-10  6:12                     ` Thierry Volpiatto
  2014-05-10  7:40                     ` Michael Heerdegen
  2 siblings, 0 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  6:12 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> How 'bout the patch below,
>
> BTW, for older Emacsen, you can probably use a hack along the lines of
> the guaranteed 100% untested code below:
>
>    (defun funcall-interactively (fun &rest args)
>      (call-interactively
>        (cond
>         ((consp fun)
>          (mapcar (lambda (x)
>                    (if (eq (car-safe x) 'interactive))
                                                       ^
>                      `(interactive ',args) x)
>                  fun))
>         ((byte-code-function-p)
                                ^ missing arg ?
>          (apply #'make-byte-code
>                 (aref 0 fun)
>                 (aref 1 fun)
>                 (aref 2 fun)
>                 (aref 3 fun)
>                 (aref 4 fun)
>                 `',args)))))

This won't work IMO, why fun would be a cons or a byte-code-function ?
 
-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10  5:51                   ` Thierry Volpiatto
@ 2014-05-10  6:45                     ` Stefan Monnier
  2014-05-10  8:06                       ` Thierry Volpiatto
  2014-05-10 10:22                       ` Andreas Röhler
  0 siblings, 2 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-10  6:45 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> (apply #'funcall-interactively (car newcmd) (cdr newcmd))

No, `newcmd' is an expression, so (cdr newcommand) contains arguments
that need to be evaluated.  In some/many cases this evaluation is
trivial (the args are self-quoting, like nil or integers), but sometimes
the args can be things like (region-beginning).

> >    (defun funcall-interactively (fun &rest args)
[sample hack to define funcall-interactively in terms of call-interactively]
> This won't work IMO, why fun would be a cons or a byte-code-function ?

These are the only interesting cases.  The other cases (subrp and
symbolp, AFAICT) are trivial.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 22:39                   ` Stefan Monnier
  2014-05-09 23:34                     ` Drew Adams
  2014-05-10  6:12                     ` Thierry Volpiatto
@ 2014-05-10  7:40                     ` Michael Heerdegen
  2014-05-10  8:41                       ` Thierry Volpiatto
  2 siblings, 1 reply; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-10  7:40 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446, Thierry Volpiatto

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> BTW, for older Emacsen, you can probably use a hack along the lines of
> the guaranteed 100% untested code below:

I tried to make it work:

   (defun funcall-interactively (fun &rest args)
     (setq fun (indirect-function fun))
     (call-interactively
       (cond
        ((consp fun)
         (mapcar (lambda (x)
                   (if (eq (car-safe x) 'interactive)
                       `(interactive ',args) x))
                 fun))
        ((byte-code-function-p fun)
         (apply #'make-byte-code
                (aref fun 0)
                (aref fun 1)
                (aref fun 2)
                (aref fun 3)
                (aref fun 4)
                (aref fun 5)
                args)))))

Works at least with the count-words case:

  (funcall-interactively 'count-words nil nil) ==> something useful

Michael.






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10  6:45                     ` Stefan Monnier
@ 2014-05-10  8:06                       ` Thierry Volpiatto
  2014-05-10 20:15                         ` Stefan Monnier
  2014-05-10 10:22                       ` Andreas Röhler
  1 sibling, 1 reply; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  8:06 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> (apply #'funcall-interactively (car newcmd) (cdr newcmd))
>
> No, `newcmd' is an expression, so (cdr newcommand) contains arguments
> that need to be evaluated.  In some/many cases this evaluation is
> trivial (the args are self-quoting, like nil or integers), but sometimes
> the args can be things like (region-beginning).

Hmm, not sure of this, at least for `repeat-complex-command' something
like (region-beginning) is already evaluated and recorded as an integer
no ?
Oh! ok I see, something like M-: (region-beginning)
will be recorded as something like 

(pp-eval-expression (quote (region-beginning)))

>> >    (defun funcall-interactively (fun &rest args)
> [sample hack to define funcall-interactively in terms of call-interactively]
>> This won't work IMO, why fun would be a cons or a byte-code-function ?
>
> These are the only interesting cases.  The other cases (subrp and
> symbolp, AFAICT) are trivial.

I still don't understand how this would be able to call interactively
something like:

(count-words-region 234 567 nil)

-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10  7:40                     ` Michael Heerdegen
@ 2014-05-10  8:41                       ` Thierry Volpiatto
  0 siblings, 0 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  8:41 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 17446


Michael Heerdegen <michael_heerdegen@web.de> writes:

> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
>> BTW, for older Emacsen, you can probably use a hack along the lines of
>> the guaranteed 100% untested code below:
>
> I tried to make it work:
>
>    (defun funcall-interactively (fun &rest args)
>      (setq fun (indirect-function fun))
>      (call-interactively
>        (cond
>         ((consp fun)
>          (mapcar (lambda (x)
>                    (if (eq (car-safe x) 'interactive)
>                        `(interactive ',args) x))
>                  fun))
>         ((byte-code-function-p fun)
>          (apply #'make-byte-code
>                 (aref fun 0)
>                 (aref fun 1)
>                 (aref fun 2)
>                 (aref fun 3)
>                 (aref fun 4)
>                 (aref fun 5)
>                 args)))))
>
> Works at least with the count-words case:
>
>   (funcall-interactively 'count-words nil nil) ==> something useful

Great, works also with `count-words-region'.

-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 23:34                     ` Drew Adams
  2014-05-10  2:13                       ` Stefan Monnier
@ 2014-05-10  9:10                       ` Thierry Volpiatto
  1 sibling, 0 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-10  9:10 UTC (permalink / raw)
  To: Drew Adams; +Cc: Michael Heerdegen, 17446


Drew Adams <drew.adams@oracle.com> writes:

> In any case, I will wait to see how this changes the
> `repeat-complex-command' code and then do likewise for my code,
> which is similar.

Probably I will inline the funcall-interactively version Stefan and
Michael sent and use something like this in helm:

(defun helm-sexp-eval (cand)
  (let ((sexp (read cand)))
    (condition-case err
        (apply #'funcall-interactively (car sexp)
               (mapcar (lambda (e) (eval e t)) (cdr sexp)))
      (error (message "Evaluating gave an error: %S" err)
             nil))))

Probably you can do something similar in icicles.

-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10  6:45                     ` Stefan Monnier
  2014-05-10  8:06                       ` Thierry Volpiatto
@ 2014-05-10 10:22                       ` Andreas Röhler
  2014-05-10 20:19                         ` Stefan Monnier
  1 sibling, 1 reply; 37+ messages in thread
From: Andreas Röhler @ 2014-05-10 10:22 UTC (permalink / raw)
  To: 17446

On 10.05.2014 08:45, Stefan Monnier wrote:
>> (apply #'funcall-interactively (car newcmd) (cdr newcmd))
>
> No, `newcmd' is an expression, so (cdr newcommand) contains arguments
> that need to be evaluated.  In some/many cases this evaluation is
> trivial (the args are self-quoting, like nil or integers), but sometimes
> the args can be things like (region-beginning).
>
>>>     (defun funcall-interactively (fun &rest args)
> [sample hack to define funcall-interactively in terms of call-interactively]
>> This won't work IMO, why fun would be a cons or a byte-code-function ?
>
> These are the only interesting cases.  The other cases (subrp and
> symbolp, AFAICT) are trivial.
>
>
>          Stefan
>
>
>
>

So maybe the good old and simple (interactive-p) needs no longer being obsolete?

Andreas





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10  8:06                       ` Thierry Volpiatto
@ 2014-05-10 20:15                         ` Stefan Monnier
  2014-05-11  4:24                           ` Michael Heerdegen
  2014-05-11  4:31                           ` Thierry Volpiatto
  0 siblings, 2 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-10 20:15 UTC (permalink / raw)
  To: Thierry Volpiatto; +Cc: Michael Heerdegen, 17446

> I still don't understand how this would be able to call interactively
> something like:

> (count-words-region 234 567 nil)

The code I showed takes an interactive function with some args, rips the
function apart to rebuild a new one whose interactive spec just returns
those args.
If the function is a symbol, then recurse on (symbol-function fun).


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10 10:22                       ` Andreas Röhler
@ 2014-05-10 20:19                         ` Stefan Monnier
  2014-05-11  7:47                           ` Andreas Röhler
  0 siblings, 1 reply; 37+ messages in thread
From: Stefan Monnier @ 2014-05-10 20:19 UTC (permalink / raw)
  To: Andreas Röhler; +Cc: 17446

> So maybe the good old and simple (interactive-p) needs no longer
> being obsolete?

Unrelated.  It's obsolete because it's replaced by called-interactively-p.
The discussion here applies just as much about interactive-p as about
called-interactively-p.

And using/introducing funcall-interactively doesn't solve all the other
problems with interactive-p/called-interactively-p, such as the fact
that they may (depending on the position of the sun) return nil rather
than t if called within an `unwind-protect'.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10 20:15                         ` Stefan Monnier
@ 2014-05-11  4:24                           ` Michael Heerdegen
  2014-05-11  5:58                             ` Michael Heerdegen
  2014-05-11  6:02                             ` Stefan Monnier
  2014-05-11  4:31                           ` Thierry Volpiatto
  1 sibling, 2 replies; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-11  4:24 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446, Thierry Volpiatto

Stefan Monnier <monnier@iro.umontreal.ca> writes:

> The code I showed takes an interactive function with some args, rips
> the function apart to rebuild a new one whose interactive spec just
> returns those args.  If the function is a symbol, then recurse on
> (symbol-function fun).

Yes, it's a funny idea.

Stefan, what's the right approach to make commands that refer to
this-command or last-command work correctly when called with your code?
Should we add something like

  (when (symbolp fun) (setq this-command fun))  ?

Does your patch planned for later inclusion care about updating
this-command and last-command appropriately?


Thanks,

Michael.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10 20:15                         ` Stefan Monnier
  2014-05-11  4:24                           ` Michael Heerdegen
@ 2014-05-11  4:31                           ` Thierry Volpiatto
  1 sibling, 0 replies; 37+ messages in thread
From: Thierry Volpiatto @ 2014-05-11  4:31 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446


Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I still don't understand how this would be able to call interactively
>> something like:
>
>> (count-words-region 234 567 nil)
>
> The code I showed takes an interactive function with some args, rips the
> function apart to rebuild a new one whose interactive spec just returns
> those args.
> If the function is a symbol, then recurse on (symbol-function fun).

I got it now, thanks for explanations and your work on this.


-- 
Thierry
Get my Gnupg key:
gpg --keyserver pgp.mit.edu --recv-keys 59F29997 






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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-11  4:24                           ` Michael Heerdegen
@ 2014-05-11  5:58                             ` Michael Heerdegen
  2014-05-17 18:01                               ` Michael Heerdegen
  2014-05-11  6:02                             ` Stefan Monnier
  1 sibling, 1 reply; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-11  5:58 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446, Thierry Volpiatto

Michael Heerdegen <michael_heerdegen@web.de> writes:

>   (when (symbolp fun) (setq this-command fun))  ?

call-interactively doesn't set `this-command'.  Nor does
`repeat-complex-command'.  Should one of them set it?

Example:

--8<---------------cut here---------------start------------->8---
(defvar the-string nil)

(defun test (string)
  (interactive (list (if (eq this-command last-command)
                         the-string
                       (setq the-string (read-string "Enter string: ")))))
  (message (concat "You "
                   (if (eq this-command last-command) "had" "have")
                   " entered "
                   the-string)))

(global-set-key [f12] #'test)
--8<---------------cut here---------------end--------------->8---

If you repeat `test' via repeat-complex-command and hit f12 after that,
it doesn't behave as expected (i.e., message "You had entered ...").
Should it?

Michael.





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-11  4:24                           ` Michael Heerdegen
  2014-05-11  5:58                             ` Michael Heerdegen
@ 2014-05-11  6:02                             ` Stefan Monnier
  1 sibling, 0 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-11  6:02 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 17446, Thierry Volpiatto

> Stefan, what's the right approach to make commands that refer to
> this-command or last-command work correctly when called with your code?

`this/last-command' are not directly related to call-interactively.
Instead they're handled by the top-level command loop.

> Does your patch planned for later inclusion care about updating
> this-command and last-command appropriately?

No.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-10 20:19                         ` Stefan Monnier
@ 2014-05-11  7:47                           ` Andreas Röhler
  0 siblings, 0 replies; 37+ messages in thread
From: Andreas Röhler @ 2014-05-11  7:47 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446

On 10.05.2014 22:19, Stefan Monnier wrote:
>> So maybe the good old and simple (interactive-p) needs no longer
>> being obsolete?
>
> Unrelated.  It's obsolete because it's replaced by called-interactively-p.
> The discussion here applies just as much about interactive-p as about
> called-interactively-p.

[ ... ]

Okay, thanks.

Andredas







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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-11  5:58                             ` Michael Heerdegen
@ 2014-05-17 18:01                               ` Michael Heerdegen
  2014-05-18  1:56                                 ` Stefan Monnier
  0 siblings, 1 reply; 37+ messages in thread
From: Michael Heerdegen @ 2014-05-17 18:01 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: 17446, Thierry Volpiatto

Hi,

my last question was: should `repeat-complex-command' set
`this-command'?  See my example.  If the answer is "yes" - shall I
create a separate bug report?


Thanks,

Michael.



> Example:
>
> (defvar the-string nil)
>
> (defun test (string)
>   (interactive (list (if (eq this-command last-command)
>                          the-string
>                        (setq the-string (read-string "Enter string: ")))))
>   (message (concat "You "
>                    (if (eq this-command last-command) "had" "have")
>                    " entered "
>                    the-string)))
>
> (global-set-key [f12] #'test)
>
> If you repeat `test' via repeat-complex-command and hit f12 after that,
> it doesn't behave as expected (i.e., message "You had entered ...").
> Should it?





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-17 18:01                               ` Michael Heerdegen
@ 2014-05-18  1:56                                 ` Stefan Monnier
  0 siblings, 0 replies; 37+ messages in thread
From: Stefan Monnier @ 2014-05-18  1:56 UTC (permalink / raw)
  To: Michael Heerdegen; +Cc: 17446, Thierry Volpiatto

> my last question was: should `repeat-complex-command' set
> `this-command'?  See my example.  If the answer is "yes" - shall I
> create a separate bug report?

It probably should, yes.  Just like execute-extended-command does.


        Stefan





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

* bug#17446: 24.4.50; What is the situation around `called-interactively-p'?
  2014-05-09 19:50               ` Stefan Monnier
  2014-05-09 21:02                 ` Stefan Monnier
  2014-05-10  3:43                 ` Thierry Volpiatto
@ 2017-03-25  6:23                 ` npostavs
  2 siblings, 0 replies; 37+ messages in thread
From: npostavs @ 2017-03-25  6:23 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Michael Heerdegen, 17446, Thierry Volpiatto

close 17446 25.1
quit

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> Another approch would be to allow more args to `call-interactively',
>> this would allow one to use:
>
>> (apply 'call-interactively '(sexp arg1 arg2 arg...))
>
>> But not sure this would cover all use cases.
>
> Right, I'm thinking of introducing a new `funcall-interactively' which
> is just like `funcall' except that the called function will see its
> `called-interactively-p' returning non-nil.
>
> But I think this will have to wait for 24.5.

Seems to have been done in 25.1





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

end of thread, other threads:[~2017-03-25  6:23 UTC | newest]

Thread overview: 37+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-09 12:29 bug#17446: 24.4.50; What is the situation around `called-interactively-p'? Thierry Volpiatto
2014-05-09 13:39 ` Drew Adams
2014-05-09 14:11   ` Michael Heerdegen
2014-05-09 14:47     ` Drew Adams
2014-05-09 14:17   ` Drew Adams
2014-05-09 14:15 ` Stefan Monnier
2014-05-09 14:28   ` Drew Adams
2014-05-09 14:50     ` Stefan Monnier
2014-05-09 14:55       ` Drew Adams
2014-05-09 15:15         ` Michael Heerdegen
2014-05-09 17:53           ` Stefan Monnier
2014-05-09 18:47             ` Thierry Volpiatto
2014-05-09 19:50               ` Stefan Monnier
2014-05-09 21:02                 ` Stefan Monnier
2014-05-09 22:39                   ` Stefan Monnier
2014-05-09 23:34                     ` Drew Adams
2014-05-10  2:13                       ` Stefan Monnier
2014-05-10  9:10                       ` Thierry Volpiatto
2014-05-10  6:12                     ` Thierry Volpiatto
2014-05-10  7:40                     ` Michael Heerdegen
2014-05-10  8:41                       ` Thierry Volpiatto
2014-05-10  5:51                   ` Thierry Volpiatto
2014-05-10  6:45                     ` Stefan Monnier
2014-05-10  8:06                       ` Thierry Volpiatto
2014-05-10 20:15                         ` Stefan Monnier
2014-05-11  4:24                           ` Michael Heerdegen
2014-05-11  5:58                             ` Michael Heerdegen
2014-05-17 18:01                               ` Michael Heerdegen
2014-05-18  1:56                                 ` Stefan Monnier
2014-05-11  6:02                             ` Stefan Monnier
2014-05-11  4:31                           ` Thierry Volpiatto
2014-05-10 10:22                       ` Andreas Röhler
2014-05-10 20:19                         ` Stefan Monnier
2014-05-11  7:47                           ` Andreas Röhler
2014-05-10  3:43                 ` Thierry Volpiatto
2017-03-25  6:23                 ` npostavs
2014-05-09 19:16             ` Drew Adams

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).