2017-10-01 2 views
2

Ich möchte wieder verwenden current-prefix-arg beim Aufruf this-command. Ich kann mir vorstellen, wie man seinen Wert erfassen und an veränderte Funktionen weitergeben kann. Aber das scheint keine gute Lösung zu sein. Wie kann ich es wiederverwenden (z. B. zurück auf eine Art Call-Stack oder was auch immer Emacs verwendet)?Wie übergeben Strom-Präfix-Arg zu diesem Befehl

Das Beispiel eine einfache Funktion ist zum Erhöhen/Vermindern der Angaben in der Region schreibt ich gerade da, wo ich vorübergehend will binden i oder Abnahme zu erhöhen, wenn es mit dem Präfix aufgerufen wurde. Kann ich das tun, ohne der Funktion ein weiteres Argument hinzuzufügen, sondern nur das ursprüngliche Präfix?

(defun my-toggle-increment-numbers (start end) 
    "Simple function to increment numbers in region. Decrement with prefix." 
    (interactive "r") 
    (let (deactivate-mark) 
    (goto-char start) 
    (while (re-search-forward "\\([[:digit:]]+\\)" end 'move) 
     (replace-match (number-to-string 
         (+ (if current-prefix-arg -1 1) 
         (string-to-number (match-string 1)))) 
        nil nil nil 1)) 
    ;; what is good way to reused the current-prefix-argument value when 
    ;; calling this-command? 
    (set-transient-map 
    (let ((km (make-sparse-keymap))) 
     (define-key km "i" this-command) 
     km) 
    t))) 

Antwort

2

Versuchen Sie folgendes:

(defun my-toggle-increment-numbers (start end &optional decrement) 
    "Simple function to increment numbers in region. Decrement with prefix." 
    (interactive "r\nP") 
    (let (deactivate-mark) 
    (setq start (copy-marker start) 
      end (copy-marker end)) 
    (goto-char start) 
    (while (re-search-forward "\\([-]?[[:digit:]]+\\)" end 'move) 
     (replace-match (number-to-string (+ (if decrement -1 1) 
              (string-to-number (match-string 1)))) 
        nil nil nil 1)) 
    (set-transient-map 
    (let ((km (make-sparse-keymap))) 
     (define-key km "i" `(lambda() 
          (interactive) 
          (my-toggle-increment-numbers ',start ',end ',decrement))) 
     km) 
    t))) 
  1. Sie haben vergessen, das Minuszeichen vor Ihrem [[:digit:]] aufzunehmen.

  2. Sie müssen entweder lexikalische Bindung verwenden oder einen Befehl erstellen, die die aktuellen Werte von start, end und current-prefix-arg bindet (oder decrement - siehe nächste).

  3. Es ist ein bisschen einfacher, wenn Sie ein Argument anstelle von current-prefix-arg verwenden.

    (Sie fragen, ob Sie nur current-prefix-arg anstelle des Hinzufügens eines arg für sie verwenden können. Ja. In diesem Fall lassen bind current-prefix-arg in der konstruierten Befehl, der für nachfolgende Anrufe aufgerufen wird.)

  4. Seit Ersatz kann die Anzahl der Ziffern in einer Zahl (zB 9-10 ändern, müssen Sie anstelle der Zahlenwert von end in nachfolgenden Aufrufen einen Marker verwenden.

+0

@jenesaisquoi: Druck auf ungelesene-Befehl-Ereignisse kann (oder auch nicht) arbeiten, aber wenn der Benutzer dann einen anderen Befehl aufruft, wer weiß, welche Wirkung würde dein Präfix Argument haben ?! Ich bin mir ziemlich sicher, dass du so etwas nicht machen willst. – phils

+0

Der vorherige Präfix-arg-Wert ist als 'last-prefix-arg' verfügbar, also' (let ((current-prefix-arg last-prefix-arg))) ist eine Sache, die Sie tun können. Ich habe das nicht getestet, aber Sie könnten versuchen '(lassen Sie ((current-prefix-arg last-prefix-arg)) (Aufruf-interaktiv letzten-Befehl))' – phils

+0

@phils Danke, das war, was ich gesucht habe – jenesaisquoi

1

ich die sauberste Art und Weise denken, ist es, einen Befehl zu erstellen welches ruftaufes das Präfix arg übergeben:

;; This relies on -*- lexical-binding:t -*- 
(defun my-toggle-increment-numbers (start end) 
    [...] 
    (set-transient-map 
    (let ((km (make-sparse-keymap)) 
     (tc this-command) 
     (cpa current-prefix-arg)) 
    (define-key km "i" 
     (lambda() (interactive) 
     (let ((current-prefix-arg cpa)) 
      (call-interactively tc)))) 
    km) 
    t))) 

Es ist wahrscheinlich ausführlicher als was Sie sich vorzustellen, aber ich denke, es ist in der Nähe von dort ist, was Sie fragen. Eine einfachere Art und Weise fast das gleiche Ergebnis zu erhalten könnte sein:

(defun my-toggle-increment-numbers (start end) 
    [...] 
    (setq prefix-arg current-prefix-arg) 
    (set-transient-map 
    (let ((km (make-sparse-keymap))) 
    (define-key km "i" this-command) 
    km) 
    t))) 
+1

@jenesaisquoi: Tatsächlich fehlte meinem ersten Beispiel ein "petit je ne sais quoi", das ich gerade hinzugefügt habe. – Stefan

+0

Nochmals vielen Dank, ich endete mit Ihrem zweiten Beispiel mit einigen von @Drew vorgeschlagenen Änderungen – jenesaisquoi

Verwandte Themen