Проблемы при попытке использовать MySQL вместе с Emacs - PullRequest
1 голос
/ 02 февраля 2011

Я столкнулся с проблемой, пытаясь использовать MySQL вместе с Emacs. Позвольте мне начать с предоставления информации о соответствующей версии:

Local OS: Windows XP, SP3
Terminal emulator/SSH client: Putty 0.58
Remote OS (as reported by uname -a): Linux 2.6.19.7 (also happens on another installation whose Linux is 2.6.18)
Emacs version (running on remote OS): 21.3.1 (also happens on another installation whose Emacs is 21.4.1)
MySQL version (running on remote OS): 4.1.22 (also happens on another installation whose MySQL is 5.0.91)

У меня всегда есть буфер оболочки, работающий внутри Emacs, и я хотел бы запустить команду «mysql», чтобы я мог выполнять SQL-запросы. Но если я наберу

mysql -uuserid -ppassword

просто висит. Когда я убиваю процесс mysql, он сообщает:

bash: [XXXXX: 2] tcsetattr: Invalid argument
    (where XXXXX is the process id of the bash shell that's the parent of the mysql process that was killed.)

Несколько лет назад я написал C-код, который вызывал tcsetattr () для установки флагов для драйвера устройства tty. Я помню, что это основывалось на идее, что tty был подключен через RS-232, и на многих атрибутах, которые вы устанавливаете через tcsetattr () контролируемые характеристики соединения RS-232 - скорость в бодах, четность и т. Д. Очевидно, что для псевдо- Таким образом, большая часть этого не имеет значения. Похоже, что исполняемый файл mysql пытается выполнить какое-то аппаратное управление, которое не работает в контексте буфера оболочки Emacs.

В ходе дальнейших исследований я обнаружил, что в Emacs есть функция Lisp с именем sql-mysql, которая, похоже, напрямую выполняет запросы MySQL. Это звучало хорошо для меня. Но когда я попробовал это, я столкнулся с различными проблемами.

Какая небольшая документация, которую я смог найти о том, как использовать M-x sql-mysql, была довольно неполной. Он не дал никакой информации о том, как выполнить запрос. http://www.emacswiki.org/emacs/SqlMode говорит,

"Type M-x sql-help RET to read the online help."

так я и сделал. Помощь предлагает запустить:

M-x sql-mysql

, чтобы вызвать MySQL, а затем говорит,

"Once you have the SQLi buffer, you can enter SQL statements in the buffer.  The output generated is appended to the buffer and a new prompt is generated."

Буфер никогда не отображал подсказку. Я не могу щелкнуть по элементам в строке меню Emacs, потому что я подключаюсь через ssh (клиент - замазка), а замазка, похоже, не передает щелчки мышью. Поэтому я не могу получить доступ к меню "SQL" или "In / Out" в меню Emacs.

Я попытался отправить C-c (набрав C-c C-c) в буфер * SQL *, ожидая, что это приведет к его выходу, так же, как и к буферу оболочки. К моему большому удивлению, он отобразил вывод запроса, который я ввел, прежде чем сообщать:

Ctrl-C -- exit!
Process SQL exited abnormally with code 1

Затем я заметил, что M-x sql-help также говорит:

"If you have a really complex SQL statement or if you are writing a procedure, you can do this in a separate buffer. Put the new buffer in `sql-mode' by calling M-x sql-mode.  The name of this buffer can be anything.  The name of the major mode is SQL."

"In this SQL buffer (SQL mode), you can send the region or the entire buffer to the interactive SQL buffer (SQLi mode).  The results are appended to the SQLi buffer without disturbing your SQL buffer."

Итак, я создал второй буфер, назвал его «my-sql-buffer» и запустил M-x sql-mode. Когда я набираю запрос:

show tables;

в этот буфер и завершить его с помощью RET, в буфере * SQL * ничего не происходит. Я попытался расположить курсор в конце запроса и набрать C-c C-c. Внизу отображается минибуфер:

"Sent string to buffer *SQL*."

но в буфере * SQL * ничего не появилось. Я напечатал C-C C-C еще несколько раз. Каждый раз, когда минибуфер снова отображается:

"Sent string to buffer *SQL*."

После ввода C-c C-c несколько раз неожиданно выводился в буфере * SQL *. Это был выход из:

show tables;

повторяется 5 раз! За исключением последнего раза остановился в середине. Такое поведение предполагает, что что-то буферизирует вывод. Я проверил, сколько байтов было выведено (C-x h M-C- | wc -c), и он выдал 4096 байтов! Поскольку 4K - это общий размер буфера, это подтверждает моё подозрение, что что-то буферизирует вывод. Но я не могу понять, что делает буферизацию и как ее отключить.

Может ли кто-нибудь помочь мне решить одну или несколько из следующих проблем:

  1. Как запустить исполняемый файл mysql из командной строки bash внутри emacs и не заставить его зависать при вызове tcsetattr ()?

  2. Как запустить M-x sql-mysql, ввести запрос в буфер * SQL * и запустить его без выхода из процесса SQL?

  3. Как сбрасывать вывод в * SQL * после каждого запроса, когда я набираю запрос во второй буфер, который находится в режиме sql?

advTHANKSance за вашу помощь.

Mark Rosenthal

1 Ответ

5 голосов
/ 14 февраля 2011

Вы должны добавить (setq sql-mysql-options '("-C" "-t" "-f" "-n")) к вашему _emacs, чтобы sql-mysql правильно работал в Windows.M-x describe-variable sql-mysql-options для чтения документов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...