Emacs: Как посетить все буферы sql-режима и установить соответствующий sql-буфер

Мое типичное использование режима sql в emacs:

а. откройте файл foo.sql и начните редактирование

б. решить, что я хочу запустить его, используя привязки клавиш для sql-send-region

в. запустите мою пользовательскую функцию (db-connect) для подключения к соответствующей базе данных и создайте буфер * SQL *.

Однако foo.sql не знает о существовании буфера * SQL *, если я не выполняю «mx sql-mode» в буфере, чтобы обновить его среду и обнаружить, что такой буфер существует в этот момент. Я хотел бы встроить некоторый код в свою пользовательскую функцию db-connect, чтобы посетить все буферы с использованием режима sql и обновить переменную sql-buffer. Я уверен, что несколько участников переполнения стека должны были сделать это или что-то подобное раньше.

Спасибо,

SetJmp


person Setjmp    schedule 24.03.2011    source источник


Ответы (2)


Беглый просмотр файла sql.el выявил команду sql-set-sqli-buffer-generally, может быть, это что-то для вас?

Другой способ, которым вы могли бы это сделать, — убить локальный вариант sql-buffer в буфере, вызвав kill-local-variable в хуке основного режима. (Таким образом, все буферы SQL будут обращаться к последнему буферу SQL.)

Отказ от ответственности: я ничего не знаю о SQL или режиме SQL, только об Emacs в целом.

person Lindydancer    schedule 25.03.2011

Я реализовал эту небольшую вспомогательную функцию для фильтрации буферов по их основному режиму.

(defun buffer-mode (buffer-or-name)
  (with-current-buffer buffer-or-name major-mode))


(defun filter-buffers-by-mode (mode)
  (delq nil
        (mapcar
         (lambda (x) (and (eq (buffer-mode x) mode) x))
         (buffer-list))))

Вы можете передать 'sql-mode в качестве аргумента, и вы получите список всех открытых буферов sql.

person Bozhidar Batsov    schedule 24.03.2011
comment
Этот код для какой-то старой версии Emacs? Он не работает с (void-function buffer-mode) на моем Emacs 23.3.1 (OS X). Я предполагаю, что это означает извлечь основной режим буфера. Он доступен в переменной major-mode, которая является локальной для буфера. - person vpit3833; 26.03.2011
comment
Нет, не старый. Это просто то, что я написал, но я совершенно забыл об этом - (defun buffer-mode (buffer-or-name) (with-current-buffer buffer-or-name major-mode)) - person Bozhidar Batsov; 27.03.2011