Как создать привязки клавиш Emacs для интерактивных функций org-mode / команд org-mode с аргументами? - PullRequest
1 голос
/ 10 января 2020

с помощью функции org-deadline можно определить срок выполнения задач в режиме Emacs org. Описание выглядит следующим образом:

(org-deadline ARG &optional TIME)

Insert the "DEADLINE:" string with a timestamp to make a deadline.
With one universal prefix argument, remove any deadline from the item.
With two universal prefix arguments, prompt for a warning delay.
With argument TIME, set the deadline at the corresponding date.  TIME
can either be an Org date like "2011-07-24" or a delta like "+2d".

Я хочу создать привязку ключа, чтобы установить дату окончания в 1 неделю напрямую. Таким образом, связывание клавиш должно вызывать функцию org-deadline и давать +1w в качестве аргумента. Запись (org-deadline nil "+1w"), а затем выполнение eval для этого региона работает, как и ожидалось.

Но почему я не могу связать это с ключом? Я попробовал следующие два варианта:

  1. (defun org-deadline-in-one-week ()
      (interactive)
      (org-deadline nil "+1w"))
    (global-set-key (kbd "C-c C-s") 'org-deadline-in-one-week)
    
  2. (global-set-key (kbd "C-c C-s") (lambda () (interactive) (org-deadline nil "+1w")))
    

Оба способа терпят неудачу в том смысле, что интерактивное меню для выбора дата все еще показана. Он побуждает меня выбрать дату с помощью клавиш курсора, а затем подтвердить с помощью RET. Но я хочу использовать интерактивную функцию неинтерактивно и просто установить срок оплаты на одну неделю в будущем. Чего мне не хватает?

Обновление: я использую Org mode version 9.1.9 (release_9.1.9-65-g5e4542 @ /usr/share/emacs/26.1/lisp/org/).

1 Ответ

0 голосов
/ 12 января 2020

Вы столкнулись с проблемами раскладки клавиатуры: C-c C-s связан с org-mode-maporg-schedule). Это основная таблица режимов для режима Org, и она переопределяет глобальную карту в буферах режима Org. Смотрите Активные раскладки клавиш в руководстве по Emacs Lisp - на самом деле, чтение (и перечитывание) всей главы - хорошая идея.

Вы должны сделать две вещи: определить ключ в org-mode-map не на глобальной карте; и убедитесь, что ключ еще не определен (или, по крайней мере, вы не против потерять его текущие настройки). Например, C-c s не определен в org-mode-map (по умолчанию), поэтому я бы сделал

(define-key org-mode-map (kbd "C-c s") 'org-deadline-in-one-week)
...