LINUX.ORG.RU

[gnus, bbdb] - несколько вопросов


0

0

Несколько вопросов по адресной книге bbdb в gnus:

1. Можно ли из gnus цивилизованно просмотреть адресную книгу? Про файл .bbdb я знаю, но может есть более цивилизованные способы.

2. При подстановке адреса в формат приходится набирать начальные буквы адреса и жать Tab. Часто я не помню начало адреса, но точно знаю набор симоволов, которые точно присутсвуют в адресе. То есть, можно ли искать адрес по регулярному выражению? Что то типа *pupkin*.

★★

>2. При подстановке адреса в формат приходится набирать начальные 
буквы адреса и жать Tab. Часто я не помню начало адреса, но точно знаю
 набор симоволов, которые точно присутсвуют в адресе. То есть, можно 
ли искать адрес по регулярному выражению? Что то типа *pupkin*.

Насколько я вижу у себя, (message-expand-name) сделана примитивно на 
базе (bbdb-complete-name). Думаю, надо писать поиск по подстроке. 
Функция (bbdb-search ...) как раз делает то, что надо -- ищет по 
подстроке. У меня старый gnus, emacs и  bbdb, поэтому не уверен за то, 
что в новых версиях чего-то похожего нет. Я тут написал вот тебе 
примерно функцию (bbdb-complete-name), которая делает примерно то, что
надо. Она ищет по *подстроке* в нескольких полях одновременно (смотри, 
как у меня вызывается bbdb-search и ее описание C-h f bbdb-search). 
Это набросок. Надо бы грамотнее буфер *Completions* сделать. Если один
 вариант только подходит, то он сразу высвечивается. Если несколько, 
то комплит предлагается. Повторю, что я у себя не нашел нужной тебе 
функциональности. Может, она и есть. Мне показалось, что только по
первым символам (почты, имени) можно, если штатно. 
Особо не тестировал.

(defun bbdb-complete-name (&optional start-pos)
  (interactive)
  (let* ((end (point))
         (beg (or start-pos
                  (save-excursion
                    (re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*")
                    (goto-char (match-end 0))
                    (point))))
         (orig (buffer-substring beg end))
	 (recs (bbdb-search (bbdb-records) orig orig orig orig nil)))
    (if	recs
	(if (= 1 (length recs))
	    (progn
	      (delete-region beg end)
	      (insert (bbdb-dwim-net-address (car recs))))
	  (let ((standard-output (get-buffer-create "*Completions*")))
	    (save-excursion (set-buffer standard-output)
			    (setq buffer-read-only nil)
			    (erase-buffer))
	    (display-completion-list (mapcar 'bbdb-dwim-net-address recs))
	    (delete-region beg end)
	    (switch-to-buffer standard-output))))))

Zubok ★★★★★
()

Вообще, конечно, странно, что поиска по регулярным выражениям или просто по подстроке в базе нет. Большой недочет. Или есть, но не у меня.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

В elisp не силен, посмотри, пож-та. Вот часть моего конфига, касающегося bbdb. Чего-то не хватает?


(require 'bbdb)
(bbdb-initialize 'gnus 'message)
(add-hook 'gnus-startup-hook 'bbdb-insinuate-gnus)
(add-hook 'message-setup-hook 'bbdb-define-all-aliases)
(defun my-message-mode-hook () (local-set-key [(tab)] 'bbdb-complete-name))

(defun bbdb-complete-name (&optional start-pos)
(interactive)
(let* ((end (point))
(beg (or start-pos
(save-excursion
(re-search-backward "\\(\\`\\|[\n:,]\\)[ \t]*")
(goto-char (match-end 0))
(point))))
(orig (buffer-substring beg end))
(recs (bbdb-search (bbdb-records) orig orig orig orig nil)))
(if recs
(if (= 1 (length recs))
(progn
(delete-region beg end)
(insert (bbdb-dwim-net-address (car recs))))
(let ((standard-output (get-buffer-create "*Completions*")))
(save-excursion (set-buffer standard-output)
(setq buffer-read-only nil)
(erase-buffer))
(display-completion-list (mapcar 'bbdb-dwim-net-address recs))
(delete-region beg end)
(switch-to-buffer standard-output))))))

lemas ★★
() автор топика
Ответ на: комментарий от lemas

А это зачем?

(defun my-message-mode-hook () (local-set-key [(tab)] 'bbdb-complete-name))

При создании сообщения Tab уже привязан к функции (message-expand-name), которая уже сама вызывает (bbdb-complete-name). Может быть, переопределять bbdb-complete-name, как я предложил, не совсем красиво, но и так можно. Можно назвать эту самописную функцию по-другому и повесить ее на C-h v message-completions-alist, но это уже детали.

Вот теперь можешь при создании сообщения набрать любую подстроку из имени пользователя, его сайта или почты (поиск очуществляется по нескольким полям) и нажать таб (например, находясь в поле To:). Еслиодин вариант, то получишь сразу по месту почту, если несколько -- то окно выскочит с дополнениями -- там выбираешь вручную. Если надо несколько ящиков в поле, то набираешь запятую и опять повторяешь процедуру с подстрокой.

Zubok ★★★★★
()
Ответ на: комментарий от lemas

Узрел недостаток один, который исправим, конечно же. Если у человека несколько почтовых ящиков, то подставляется только первый, хотя поиск человека осуществляется по всем ящикам. Человек-то найдется, но почта подставится первая. Неплохо было бы смотреть в функции, сколько у человека ящиков и выбирать тот, который совпадает по подстроке. А если по имени человека поиск был, то сделать cycling по Tab, чтобы перебирал все возможные ящики по месту.

Zubok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.