Вычислить количество универсальных аргументов перед числовым аргументом - PullRequest
0 голосов
/ 09 марта 2019

Как найти число universal-arguments, используемое для вызова команды до numeric-argument.

Например, как я могу различить arg1 и arg2 в следующей (неправильной) функции?

(defun my-func (&optional arg1 arg2)
  (interactive "P\nP")
  (message "arg1: %S, arg2: %S, value: %S"
           arg1 arg2 (prefix-numeric-value current-prefix-arg)))

Вариант использования, прозрачно передавая значение числового префикса рекомендованномукоманда в зависимости от количества предыдущих universal-arguments, например.dired переименуйте следующие 2 файлы в текущем буфере Dired с помощью Cu 2 или в другой буфере Dired с помощью Cu Cu 2 .

Что-то вроде строкследуя совету, но на самом деле 2 передается dired-do-rename вместо 1 или 4.

(define-advice dired-do-rename (:around (fun &rest args) "defer-dwim")
  (let ((dired-dwim-target (equal '(4) current-prefix-arg)))
    (apply fun (list (max 1 (prefix-numeric-value current-prefix-arg))))))

Я вижу, что prefix-command-preserve-state-hook, но это кажется значительнымдополнительные усилия, чтобы сделать эту работу.

1 Ответ

0 голосов
/ 09 марта 2019

Извините, но ваш вопрос мне совершенно неясен, так что на это он может не ответить.

Вы говорите: «Как я могу найти число универсальных аргументов, использованных для вызова команды до числового аргумента». Я отвечу на это.

Не имеет значения, сколько раз вы пишете "P" в спецификации строки interactive. Значение является одинаковым каждый раз, и несколько таких случаев НЕ соответствуют многократному использованию C-u.

Таким образом, (interactive "P\nP\nP") просто создает три аргумента, которые имеют одинаковое значение - значение, которое получается при однократном использовании последовательности ключей префикса аргумента, независимо от того, является ли эта последовательность C-u, C-9, M--3, C-u 360 или C-u C-u C-u.

Если вы хотите, чтобы ваша функция различала, скажем, C-u, C-u C-u и C-u C-u C-u, тогда она должна проверить необработанный аргумент префикса (что "P" указывает для interactive).

  • C-u соответствует необработанному префиксу arg (4), то есть списку с только числом 4.
  • C-u C-u соответствует необработанному префиксу arg (16).
  • C-u C-u C-u соответствует необработанному префиксу arg (64).

(prefix-numeric-value '(4)) возвращает 4; (prefix-numeric-value '(16)) возвращает 16; и (prefix-numeric-value '(64)) возвращает 64.

См. Руководство по Elisp, узел Аргументы команды префикса .

Вы можете попрактиковаться с чем-то вроде этой команды, чтобы увидеть, какие результирующие необработанные и числовые аргументы префикса появляются при вводе различных последовательностей клавиш prefix-arg:

(defun foo (arg narg)
  (interactive "P\np")
  (message "ARG: %S, NARG: %S" arg narg))

Остальная часть вашего вопроса мне совершенно не понятна. Я не понимаю, что вы пытаетесь сделать с "dired-do-rename. Если я прав, рассмотрите возможность размещения двух отдельных вопросов: один спрашивает, как отличить C-u от C-u C-u, а другой - что-то (что ?) о dired-do-rename.

...