Artigo SQL Magazine 1 - Acesso e manutenção de bancos com Emacs

O emacs é um ambiente de trabalho totalmente customizável e escalável. O usuário pode excluir, modificar e acrescentar funcionalidades e teclas de atalho.

O emacs é o editor de texto oficial do projeto GNU, integrando-se, portanto, com todas as suas ferramentas. Pode ser usado como uma IDE, onde é possível editar, compilar, depurar e rodar aplicativos sem nunca precisar sair dele . Oferece recursos de edição de texto avançados como identação automática, highlight, auto completar, pular para linha de erro automaticamente, além de estar integrado com email, news, web, gerenciadores de banco de dados, ftp, telnet e muito mais.

“Perdi tudo” - grita furioso o usuário ao ver aquela mensagem de erro no console do SQLplus, depois de queimar horas escrevendo aquele comando SQL. “Porque não usei um editor de textos antes !?”

Marca o texto com o mouse, Ctrl c... Ctrl v... e nada ! Tenta uma, duas, três vezes e nada... “O que está acontecendo?”

Ctrl F9... mais uma vez, Ctrl F9 ... não vai ... não compila ... “O que houve?”

Tenta selecionar o texto e não vai. Clica o botão esquerdo do mouse sobre aquelas linhas e nada!

Essa é a reação de um analista MS-Visual Studio/Windows que começa trabalhar em ambientes heterogêneos, na frente Windows, atrás Unix, nos lados Mac, Visual Age daqui, Borland dali, Oracle, DB2, enfim... As mãos já estão acostumadas com o Visual Studio. Só de pensar em compilar, o fura-bolo esquerdo vai em direção do Ctrl e o direito em direção do F9. É assim mesmo, após anos usando os mesmos atalhos, acaba virando reflexo.

O emacs veio resolver esses problemas e muito mais. Desenvolvido por Richard Stallman, o fundador do projeto GNU, foi originalmente escrito em Teco (uma linguagem de macros). Hoje em dia o emacs está na versão 21.2, podendo ser baixado no site www.emacs.org e compilado na maioria dos sistemas operacionais do mercado.

O emacs é um ambiente de trabalho totalmente customizável e escalável. O usuário pode excluir, modificar e acrescentar funcionalidades e teclas de atalho tranqiilamente além da facilidade da Internet oferecer uma infinidade de componentes para serem instalados no IDE do emacs.

Cada linguagem tem suas peculiaridades: highlight, compilador, interpretador, depurador... enfim, o tratamento de um fonte em C não é o mesmo tratamento dado a um fonte em Java, e menos ainda há um fonte em Lisp ou em Prolog. Como o emacs suporta tantas linguagens separadamente?

Major-mode

O emacs é como um esqueleto composto por vários componentes, entre eles componentes especializados para as linguagens de programação. Um conjunto de componentes especializados constitui um major-mode (modo de edição de texto). Quando um buffer (conteúdo de uma janela) é aberto, o emacs associa automaticamente a ele um major-mode para tratá-lo e controlar todos os sinais passados para o determinado buffer.

O nome do major-mode usado aparece na mode-line (linha em cor inversa, situada na parte inferior da tela). Além disso, a mode-line apresenta outras informações úteis como o tipo de texto e se o mesmo foi alterado. Vide Figura 1.

Figura 1

Nas primeira versões do Emacs, já era notável a presença e a seleção automática dos major-modes. Quando aberto um fonte em ada (.a), logo entrava no ada-mode. Para um fonte em lisp (.l), entrava no lisp-mode, um fonte em prolog (.pl), entrava no prolog-mode. Para rodar os fontes em lisp no lisp-mode basta teclar o enter do keypad e logo aparecia o resultado na echo area, a linha que se encontra abaixo da mode-line.

Para tratamento de código SQL, o emacs-21.2 oferece dois major-modes: o SQL-mode e o SQLi mode (modo SQL interativo). O SQL-mode controla a edição de código em SQL e o SQLi-mode interage diretamente com o gerenciador de banco de dados - MySQL, Oracle, Postgres, Informix, SyBase, DB2, Interbase e SQL Server.

O SQL-mode e o SQLi-mode oferecem recursos de highlight e de auto completar. O highlight, além de colorir o código fonte também colore as mensagens exibidas no console. Para facilitar a digitação de certos comandos, o SQL-mode disponibiliza abreviações que podem ser auto completadas com um clicar na barra de espaço. Por exemplo: sel para select , upd para update, ins para insert, del para delete, entre outros.

SQL-Mode

A forma mais simples de entrar diretamente no SQL-mode é abrir um arquivo com extensão .sql. O atalho para a abertura de um arquivo é:

C-x f ( M-x fi nd-fi le ) *NomeDoArquivo* RET.

Se o arquivo não existir, será criado um novo arquivo vazio.

Caso o arquivo não tenha extensão .sql, ou o sql-mode não for carregado, podemos carregá-lo manualmente:

M-x sql-mode RET

Para carregar automaticamente o SQL-mode, ao abrir um arquivo com extensão .sql, basta acrescentar a linha seguinte no arquivo de configuração .emacs que fica no diretório do usuário ( ~user/.emacs ):

(add-to-list ‘auto-mode-alist ‘(“\\.sql\\’” . sqlmode))

Agora a Query pode ser escrita no sql-mode. É interessante a verificação do highlight no código escrito. Provavelmente, o código não aparecerá em highlight, já que por default, o highlight não está habilitado. Para habilitar o highlight no buffer corrente, basta digitar:

M-x font-lock-mode RET

Para habilitar o font-lock-mode em todos os buffers basta digitar:

M-x global-font-lock-mode RET

Para habilitar o font-lock-mode ao abrir qualquer arquivo, basta acrescentar as linhas abaixo no arquivo .emacs

<p align="justify">(custom-set-variables <p align="justify">‘(global-font-lock-mode t nil (font-lock)))

SQLi-mode

Após as configurações iniciais, para executarmos a Query digitada, é preciso entrar no SQLi-mode escolhendo uma das opções abaixo:

Por exemplo, para entrar no MySQL monitor e acessar uma base de dados, o minibuffer (localizado embaixo da mode-line) vai esperar que o usuário entre com o nome do usuário, a senha, o host e o nome da base de dados.

Se a opção do gerenciador de banco de dados escolhida não for reconhecida, primeiro deve-se carregar o SQL-mode e depois procurar chamar o modo desejado.

Continuando com o exemplo do MySQL seguem os procedimentos detalhados para acesso e interação com este banco de dados:

A) Preparando o ambiente (este procedimento pode ser pré-configurado no arquivo .emacs):

  1. Entrar no emacs
  2. Abrir um arquivo em um buffer: C-x C-f *nomearq* RET
  3. Habilitar o modo sql no buffer atual: M-x sql-mode RET
  4. Habilitar o highlight no buffer atual: M-x font-lock-mode RET
  5. Habilitar abreviações no buffer atual: M-x Abbrev-mode RET

B) Acessando o banco de dados

  1. Abrir o monitor do mysql: M-x sql-mysql RET
  2. Entrar com o nome de um usuário do banco no minibuffer e RET
  3. Entrar com a senha deste usuário no minibuffer e RET
  4. Entrar com o nome do servidor onde está localizado o mysql no minibuffer e RET
  5. Entrar com o nome da base de dados a ser acessada no minibuffer e RET
  6. Avisar ao emacs qual é o buffer que contém o mysql monitor: M-x sql-set-sqli-buffer RET *SQL* RET
  7. Passar o foco para a janela com o buffer em sql-mode: C-x o ou com o clique do botão esquerdo do mouse sobre o buffer
  8. Enviar o buffer em sql-mode para o buffer do monitor mysql: M-x M-b

Pronto ! Estamos dentro do MySQL monitor! ( Figura 2 )

C) Organizando a tela

  1. para quebrar a tela verticalmente: M-x 3
  2. para ativar o follow-mode: M-x follow-mode RET
Figura 2

Quem diria, o MySQL monitor a cores! Se você não estiver vendo as cores, habilite o font-lock-mode, como foi explicado anteriormente. Você terá o prazer de ter highlight na linha de comando, não é formidável?

Agora você não tem mais riscos de perder tudo pela ausência do scroll na linha de comando e se quiser pode até gravar o buffer:

C-x C-s ( M-x save-buffer ) *NomeDoArquivo* RET

Para habilitar o modo de auto completar, basta digitar:

M-x abbrev-mode RET

Como passar a Query de um buffer no SQL-mode para o MySQL monitor ?

Temos várias possibilidades e a mais fácil, por enquanto, é enviar o buffer inteiro de uma só vez, assim:

C-c C-b ( M-x sql-send-buffer )*NomeDoBuffer* RET

Caso apareça no echo-area, “no SQL process started”, é porque o buffer em SQL-mode não sabe qual é o nome do buffer que está em SQLi-mode. O nome do buffer aparece na mode-line à esquerda. Para passar o nome do buffer em SQLi-mode para o buffer em SQL-mode, basta entrar com o nome do buffer em SQLi-mode, assim:

M-x sql-set-sqli-buffer RET *NomeDoBuffer* RET

Janelas contínuas ( Follow mode )

Como sempre o resultado da Query pode ter muitas linhas, não cabendo na área visível da janela. Pois bem, o emacs oferece a possibilidade de dividir verticalmente cada janela em duas outras janelas (Figura 3), digitando:

C-x 3 ( M-x split-window-vertically )

As duas janelas qUe aparecem apresentam o mesmo conteúdo! Para que uma janela seja a continuação da anterior, deve-se digitar:

M-x follow-mode RET

Para dividir uma janela na horizontal, basta digitar:

C-x 2 ( M-x split-window-horizontally )
Figura 3

Para fechar uma única janela, basta colocar o foco do mouse sobre ela e digitar:

C-x 0 (M-x delete-window)

Para expandir uma janela em todo o frame:

C-x 1 (M-x delete-other-windows)

Modo texto

O emacs não depende de ambientes gráficos multi-janelas como o MS-Windows ou Xwindow para rodar. O emacs funciona perfeitamente em modo texto podendo ser executado em modo DOS e até mesmo em uma estação de trabalho como um terminal burro.

Antes mesmo que os ambientes gráficos multi-janelas se difundissem, o emacs oferecia um ambiente multi-janelas. Sem o emacs não podíamos editar, compilar e executar um programa sem precisar fechar o editor de textos para compilar e executar na linha de comando.

Frame, window e buffer

Uma “janela” do emacs exibe o conteúdo de um único buffer. O buffer é um objeto que contém o texto editado em uma “janela” do emacs. O frame do emacs é uma janela do MS-windows ou do Xwindow.

Para evitar confusão, vamos reservar a palavra janela para as subdivisões de um frame do emacs e a palavra frame para as janelas do MS-windows ou Xwindow.

Um frame do emacs pode ser subdividido em duas ou mais “janelas”. Quando executamos o emacs, por default, o frame aparece com uma única janela aberta. Este frame pode ser subdividido em duas ou mais janelas, verticalmente ou horizontalmente. Cada janela aberta tem a sua mode-line particular, porém todas as janelas de um frame compartilham a mesma barra de títulos e a mesma echo-area do frame.

Um buffer inteiro, ou uma parte de um buffer, pode ser editado em uma ou mais janelas. Cada arquivo aberto é carregado em um buffer diferente. Podemos carregar inúmeros arquivos enquanto houver memória suficiente no computador. Para carregar um arquivo em um buffer, basta fazer:

C-x C-f ( M-x fi nd-fi le ) *nomearq* RET

Todas as modificações feitas em uma janela serão refletidas em todas as janelas que estiverem editando o mesmo buffer. Quando fechamos uma janela, o espaço físico da janela é liberado para que outra janela se expanda nele, porém o buffer continua aberto. Para salvar o conteúdo do buffer, basta fazer:

C-x C-s ( M-x save-buffer )

Buffer list

O emacs armazena os buffers abertos na buffer-list, que é uma lista de buffers. Para saber quais buffers estão abertos, deve-se consultar a buffer-list digitando o comando abaixo (A lista de buffers abertos vai aparecer na janela adjacente):

C-x C-b ( M-x list-buffers )

Vamos analisar o resultado: Estamos com 2 buffers abertos em 2 janelas. Uma janela apresenta o arquivo editado, no caso, o /tmp/teste.sql e a segunda janela apresenta o buffer que contém a própria lista de buffers. O buffer *scratch* é aberto por default depois da tela de apresentação do emacs. O buffer *messages* mantém um log das mensagens que aparecem na echo area. Podemos ver que, com exceção do buffer teste.sql, todos os outros estão entre asteriscos. O asterisco indica que se trata de um buffer que interage com o sistema.

A buffer-list também traz outras informações interessantes. Se o arquivo foi modificado, vai aparecer um * na primeira coluna e se o arquivo for read-only, vai aparecer um % na segunda coluna. A coluna size exibe o tamanho do arquivo em bytes. A coluna mode exibe o major-mode do buffer. E a coluna file exibe o caminho do arquivo.

Buffer Menu mode

O buffer que contém a buffer-list não é um simples buffer de dados estáticos. A buffer-list está sendo editada no major-mode BUFFER MENU, que permite ao usuário manipular os buffers listados. Caso tenhamos aberto inúmeros buffers e queiramos fechar parte deles basta navegar na buffer list e marcar os buffers para serem fechados com um d (de delete), e logo aparecerá um D no lugar da primeira coluna da linha selecionada. Selecionamos todos aqueles que queremos fechar e pressionamos a letra x para fechar os buffers selecionados. Para salvar arquivos, basta selecionar com a letra s as linhas desejadas e executar com x. Podemos também combinar o S e o D na mesma linha. Para desmarcar, basta pressionar a letra u (de unmark) sobre a linha desejada.

Para ver o conteúdo do buffer na janela adjacente, basta clicar em C-o quando o cursor estiver na linha do buffer desejado. O foco é mantido na buffer list. Para passar o foco do cursor para o buffer selecionado, em vez de pressionar o C-o, pressiona-se somente a letra o. Para abrir o buffer em uma janela que ocupe o frame inteiro basta pressionar no número 1 na linha desejada.

Em vez de entrar na buffer-list para exibir outro buffer na janela, pode-se digitar:

C-x b ( M-x switch-to-buffer ) : ( default: *sql* ) RET

O nome do buffer selecionado por default aparece entre parêntesis e o usuário poderá introduzir o nome do buffer desejado. Caso ele não se lembre, basta pressionar o TAB e a lista de buffer aparecerá na janela adjacente.

O emacs funcionava em terminais burros com teclado e monitor de fósforo verde, desprovidos de mouse. para mudar o foco de uma janela para outra janela do mesmo frame sem o mouse basta digitar:

C-x o (M-x other-window)

Boa parte dessas operações podem ser executadas via menu. Em ambiente gráfico é só clicar com o mouse no item de menu e será exibido um item pop-up. Mas em ambiente texto pressiona-se o F10 e os itens de menu aparecerão na janela adjacente. Se pressionássemos o F10 com o foco do cursor no buffer *scratch*, apareceria na janela adjacente os itens exibidos na barra de menus:

Possible completions are:

b==>Buffers

f==>Files

t==>Tools

e==>Edit

s==>Search

m==>Mule

h==>Help

b==>buffers

Para selecionar, um deles basta clicar na letra que antecede o item de menu, como b para buffer e t para tools, assim por diante. Se pressionássemos a letra b apareceria:

Possible completions are:

s==> *scratch* *

b==>*Buffer List* *%

m==> *Messages* *

c==>*Completions* *

l==> List All Buffers (C-x C-b)

Se o teclado não pussuir o F10, não tem problema, é possível substituí-lo com M-`.

Para sair dos menus, basta clicar C-g ou três vezes escape: ESC ESC ESC.

Conclusão

O emacs é um ambiente de desenvolvimento integrado padronizado que pode ser compilado e executado em qualquer plataforma. Multijanelas, multitarefas e multifuncional. Não depende de ambientes gráficos, monitores coloridos, mouses e teclas especiais. Customizável, o usuário pode editar e gravar suas configurações particulares no arquivo ~usuario/.emacs para torná-las permanentes.

O emacs traz consigo inúmeros componentes, entre eles o SQL-mode e o SQLi- mode. O SQL-mode facilita a edição de código SQL. O SQLi-mode incrementa a linha de comando que acompanha os gerenciadores de banco de dados.

Artigos relacionados