Modes Emacs: «La commande a tenté d'utiliser un mini-tampon en mode mini-tampon»

StackOverflow https://stackoverflow.com/questions/812135

  •  03-07-2019
  •  | 
  •  

Question

Scénario:

  • Je commence à taper M-x pour taper une commande
  • Je passe à une autre fenêtre / tampon emacs car je réalise que la commande est exécutée dans la mauvaise fenêtre
  • Je commence à taper à nouveau M-x pour exécuter la commande dans la fenêtre appropriée

Résultat: la "commande redoutée" a été utilisée pour essayer d'utiliser le mini-tampon alors qu'il était dans le mini-tampon "

Cela m’arrive plusieurs fois par jour lorsque j'utilise emacs, et pas seulement dans ce scénario. Ce comportement est très hostile à l'utilisateur (modes ref et pseudo-modes dans l'interface Humane de Jef Raskin)

Existe-t-il un moyen de personnaliser le comportement d’emacs de sorte qu’au lieu de donner cette erreur, il annule simplement le premier mini-tampon et le remplace par un nouveau?

Était-ce utile?

La solution

En effet, cette fonctionnalité emacs " " est agressif et agaçant. J'ai trouvé que c'était la bonne réponse au problème. Il est fort probable que vous ayez perdu le focus du mini-tampon parce que vous avez changé de fenêtre avec la souris et PAS une commande de mini-tampon. Ainsi, chaque fois que vous perdrez la mise au point à l'aide de la souris, le mini-tampon sera effacé. Vérifiez ce post. Cela fonctionne pour moi et c'est bien mieux que les mini-tampons récursifs qui provoqueraient un mal de tête

http: // trey- jackson.blogspot.com/2010/04/emacs-tip-36-abort-minibuffer-when.html

Autres conseils

Vous pouvez définir la variable enable-recursive-minibuffers , ce qui empêchera ce message d'erreur de s'afficher. Mais il n'active que plusieurs appels au mini-tampon - il ne redirige pas la commande du mini-tampon actuel vers le nouveau tampon. Vous pouvez essayer, mais je pense que ce sera plus déroutant, car l’action initiale est toujours en attente ...

M-x est lié à 'execute-extended-command , et ré-héberger (changer le tampon d'origine) pour cette commande ressemble un peu à la programmation avec continuation. c’est-à-dire que vous appelez un sous-programme à partir de l’emplacement X, mais au lieu de revenir à X une fois terminé, vous revenez à Y. Je pense personnellement que cela créerait plus de confusion qu’il ne résoudrait. Mais je comprends la frustration (et connais d’autres qui ont la même frustration).

Je ne sais pas s'il existe une telle personnalisation, mais la façon dont je l'évite consiste à appuyer sur ctrl - g pour annuler la commande que j'étais au milieu de écrire dans le mini-tampon.

Comme ma première réponse ne vous donne pas directement ce que vous voulez, je pensais que je proposerais une vraie solution. Voici ce que j'ai:

(defvar my-execute-extended-command-source-buffer nil
  "var holding the buffer to which the extended-execute-command should apply")
(defvar in-my-execute-extended-command nil
  "internal use - indicates whether we're in a 'recursive edit' of sorts")
(defun my-execute-extended-command (command)
  "home-grown version of execute-extended-command that supports re-hosting the buffer"
  (interactive (list (if in-my-execute-extended-command
                   nil
                 (let ((in-my-execute-extended-command t))
                   (setq my-execute-extended-command-source-buffer (current-buffer))
                   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil)))))
  (if in-my-execute-extended-command
      (progn (setq my-execute-extended-command-source-buffer (current-buffer))
             (select-window (minibuffer-window)))
    (switch-to-buffer my-execute-extended-command-source-buffer)
    (call-interactively (symbol-function (intern command)))))

Je l'ai testé de cette façon. Je l'ai liée à une clé ( F10 dans mon cas, car je ne voulais pas perdre M-x ). Ensuite, avec deux fenêtres ouvertes, chacune affichant un tampon différent (disons A et B):

  1. Depuis la fenêtre affichant le tampon A: F10 isearch-for
  2. Basculez du mini-tampon vers la fenêtre affichant A: C-x o
  3. Basculez de la fenêtre montrant A à celle B: C-x o
  4. " re-host " la commande du tampon B: F10
  5. Maintenant dans le mini-tampon, terminez la commande ward RET

Lorsque j'ai commencé à saisir un terme de recherche, la recherche s'appliquait au tampon B.

Ceci ne remplace que la fonctionnalité M-x , pas les commandes invoquées à partir de M-x . De plus, cette version ne supporte pas l’argument préfixe.

J'espère que c'est ce que vous voulez.

Quelqu'un peut-il améliorer les points suivants?

J'ai abandonné et je veux juste configurer \ C-w pour annuler tout minibuffer précédent avant d'en ouvrir un nouveau (comme faire \ C-g \ C-w)

Jusqu'à présent, grâce à Trey, j'ai:

(defun cancel-completing-read ()
  (if (> (minibuffer-depth) 0) (exit-minibuffer))
   (completing-read "My-x " obarray 'commandp t nil 'extended-command-history nil nil))

(defun cancel-and-execute-command (command)
  (interactive (list (cancel-completing-read)))
  (call-interactively (symbol-function (intern command))))

(global-set-key "\M-x" 'cancel-and-execute-command)

Quelle commande dois-je utiliser à la place de exit-minibuffer ci-dessus?

j'ai essayé

keyboard-escape-quit
exit-minibuffer
keyboard-quit

Voilà:

;; automatically cancel the minibuffer when you switch to it, to avoid
;; "attempted to use minibuffer" error.
;; cy was here

(provide 'cancel-minibuffer)

(defun cancel-minibuffer-first (sub-read &rest args)
    (let ((active (active-minibuffer-window)))
        (if active
                (progn
                    ;; we have to trampoline, since we're IN the minibuffer right now.
                    (apply 'run-at-time 0 nil sub-read args)
                    (abort-recursive-edit))
            (apply sub-read args))))

(advice-add 'read-from-minibuffer :around #'cancel-minibuffer-first)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top