Next: Problemas e Dicas
Up: FMA 215 Aula 8:
Previous: Arquivos de backup:
O editor padrão que utilizaremos é o emacs. Ele pode ser utilizado
tanto em terminais de caracteres quanto no sistema de janelas X11. Em
nossos sistemas, o editor está configurado de forma mais completa quando
roda no ambiente X11 e por isto vamos usá-lo dentro deste ambiente. Ele é
um editor muito grande e poderoso, que por isto mesmo é, às vezes, um
pouco lento, em especial nas tarefas mais complexas envolvendo
programação de teclado para fins de edição automática.
Existem vários clones muito úteis do emacs que, ao mesmo tempo em
que não têm todas as poderosas propriedades dele, são bem menores e mais
rápidos. Em particular, há o jed, que ainda tem muitas das
capacidades mais úteis do emacs, sendo portanto muito útil para uso
geral. Há uma versão deste editor para o sistema X11 que se chama xjed. Há também o zile, que é realmente muito pequeno e só tem as
coisas mais básicas, sendo útil em tarefas de administração de sistemas.
A maior parte dos comandos básicos de edição que vamos ver aqui vale para
qualquer um destes editores, que são todos editores da classe Emacs.
Aprender a usar o editor é basicamente uma questão de treino repetitivo.
Como o editor é um aplicativo que estabelece uma sessão interativa com o
usuário, ele tem uma sintaxe interna própria. Aprender a usar o editor
significa aprender esta sintaxe, que é o que faremos aqui. Nesta aula nos
limitaremos às funções mais simples de edição com o emacs. Existe
uma grande quantidade de comandos muito úteis para um ou outro fim,
incluindo a possibilidade de edição automatizada de grandes quantidades
de texto. As alternativas de edição mais sofisticadas e avançadas serão
deixadas para uma outra oportunidade.
O número total de comandos do editor é muito grande, na realidade ele é
essencialmente infinito, pois o editor é extensível tanto por
programadores que escrevam macros complexos para ele quanto pelo próprio
usuário, que pode combinar comandos de forma a definir novos comandos.
Entretanto, apenas um pequeno número de comandos é essencial para que se
possa começar a usar o editor, como veremos. Para fins de ilustração,
vamos utilizar o editor em um ambiente de programação.
Já vimos antes qual o significado da combinação [Ctrl]-C (segura-se
pressionada a tecla ``control'' enquanto se digita uma vez a tecla da
letra C). Muitos dos comandos do emacs são executados através de
combinações deste tipo, de forma que vamos adotar nesta aula a abreviação
^C para este tipo de operação. Assim, [Ctrl]-A será o mesmo
que ^A e assim por diante. Note que isto é apenas uma abreviação
para facilidade de leitura deste documento e que a tecla que produz o
símbolo ``^'' não está envolvida nisto de todo.
- Crie em sua conta um diretório chamado decmat e vá para
dentro dele. Use um browser para fazer o download, a partir das páginas
da disciplina, dos arquivos que estão nos links
No primeiro link você encontra os arquivos individuais, no segundo um
único arquivo ``tar'' comprimido contendo todos os arquivos juntos. Para
abrir este arquivo ``tar'' você terá de usar o comando tar com as
opções -xzvf; para descobrir como, olhe as páginas de manual do
comando tar. Alternativamente você pode obter cada um dos arquivos
individualmente com o browser. Faça o que for mais confortável para você
e coloque cópias de todos os arquivos dentro do diretório decmat.
Trata-se de um conjunto de arquivos relativos a um programa escrito na
linguagem Fortran.
- Examine o resultado do procedimento com o comando ls. Em
seguida execute, ainda dentro deste diretório, o comando make e
veja o que acontece. Deverá ter aparecido automagicamente no diretório um
arquivo executável chamado decmat. Execute este arquivo, digitando
./decmat, digite o input solicitado, escolhendo a alternativa 1 e veja o que acontece. Em seguida execute make clean e verifique
o efeito disto no diretório, usando o ls.
- Para editar o arquivo contendo o programa principal, execute o
comando emacs Decompmat.f. Aí está o programa em Fortran. Observe
que várias regiões do texto estão coloridas com cores que caracterizam a
sua função como parte da linguagem. Por exemplo, todo o texto que está em
vermelho constitui comentários para o leitor, os quais são completamente
ignorados pelo compilador da linguagem (o g77).
- Talvez a coisa mais importante a fazer de imediato seja aprender
como sair do editor! Faça isto, digitando a combinação ^X^C.
Se o editor lhe perguntar se você quer salvar o arquivo, isto significa
que você o alterou acidentalmente. Caso isto aconteça, diga que não quer,
digitando n. Ele vai solicitar uma confirmação desta escolha,
perguntando se você quer mesmo sair perdendo as mudanças que foram
realizadas. Diga que sim digitando yes por extenso.
- Vamos agora editar outro tipo de arquivo, executando o editor com
outro argumento, emacs Makefile. Este é um arquivo de configuração
do programa make, que você rodou na segunda tarefa. Estão
codificadas neste arquivo as regras e dependências entre arquivos que
permitem ao comando make compilar automagicamente o programa. Dê
uma boa olhada e veja se você reconhece algo do que vê. Note, mais uma
vez, que o display do emacs está colorizado organizadamente.
- Vamos voltar a editar o programa principal, digitando novamente
emacs Decompmat.f. Vamos agora passear pelo arquivo afora, usando
os comandos de movimentação de cursor do emacs. A forma mais
simples de se fazer isto é usando as teclas de cursor, com as setinhas.
Elas estão organizadas da seguinte forma no teclado, num ``keypad'' logo
à direita da parte principal deste:
Elas fazem exatamente o que a intuição está gritando: movimentam o cursor
um caracter na direção indicada. Experimente fazer isto e dê uma passeada
até o final do arquivo e depois volte até o início. Observe que cada vez
que o seu cursor é movimentado de forma a sair da área visível do texto,
este pula para cima ou para baixo uma quantidade equivalente a metade da
altura da janela que você estiver usando, tendendo, portanto, a retornar
o cursor à região central da tela. Chamamos isto de ``jump scrolling''.
- Se você segurar uma das teclas de cursor apertada, a tecla será
repetida e o cursor se movimentará mais rapidamente pelo texto. Mas mesmo
assim esta ainda é uma forma lenta de movimentar o cursor. Existem
comandos que permitem uma movimentação mais rápida dele.
Em particular, os comandos ^A e ^E levam o cursor para o
início e para o final da linha, respectivamente. Observe que estes são os
mesmos comandos que funcionavam na edição de linha de comando da shell.
Isto está assim porque a shell que usamos (tcsh) foi configurada
para que os seus comandos de edição de linha de comando funcionem no
estilo da família Emacs de editores.
Além disso, as teclas [PageUp] e [PageDown] do seu teclado
servem para paginar o texto do arquivo para cima e para baixo,
movimentando de cada vez uma quantidade de linhas equivalente à altura da
tela que você estiver usando. Note que o ``Up'' e ``Down'' a que estes
comandos se referem representam a movimentação da sua janela de visão em
relação ao conjunto completo do texto que existe.
Use estas teclas de movimentação rápida para passear pelo arquivo.
Observe que, mais uma vez, manter-se uma tecla apertada causa a sua
repetição contínua. Apesar de que isto não é muito útil no caso dos
comandos ^A e ^E, certamente é útil no caso dos comandos
[PageUp] e [PageDown].
- Vamos agora apagar alguns caracteres, para a frente e para trás do
cursor. Não se preocupe com a possibilidade de destruir o conteúdo do
arquivo, afinal você pode simplesmente não salvá-lo no fim. As mudanças
que você fará estarão acontecendo numa cópia do arquivo que o editor
colocou na memória do computador, não diretamente no disco. Chamamos a
esta cópia em memória de ``buffer''. O arquivo que está no disco só será
sobrescrito quando você salvar o buffer no qual está trabalhando, o que
em geral é feito ao final da sessão de edição.
Para apagar caracteres para trás use a tecla [BackSpace] e, para
apagar caracteres que estão à direita do cursor, use o comando ^D
(do Inglês ``delete'', o nome do comando que está associado a esta tecla
é delete-char). Vá em frente e apague alguns caracteres. Em ambos
os casos, aperte e segure a tecla para apagar repetidamente.
- Também é possível apagar texto em maiores quantidades de cada vez.
O comando ^K (de kill-line) apaga todo o texto à direita do
cursor, até o final da linha. Se o cursor estiver no início da linha,
^K apaga todo o conteúdo da linha, deixando a linha em branco. Se
o cursor já estiver no final da linha, ^K apaga o caracter de
controle que representa uma quebra de linha no arquivo, com o resultado
que a linha seguinte é concatenada com a linha onde está o cursor. Assim,
com o cursor no início da linha dois comandos ^K seguidos
eliminam completamente a linha: um apaga o conteúdo e o outro elimina a
linha em branco remanescente. Tente todas estas possibilidades em algumas
das linhas do arquivo.
- O editor mantém em memória as últimas coisas que foram apagadas com
o comando ^K, de forma que é possível recuperá-las. Para fazer
isto usamos o comando ``yank'', que é executado pela combinação de
teclas ^Y. Execute este comando uma vez para verificar que a
última coisa que você apagou com ^K é reinserida no arquivo, na
posição atual do cursor.
- Pode-se usar o comando ^Y para copiar linhas ou partes de
linhas de um arquivo de um lado para o outro, quantas vezes se quiser.
Aperte ^Y várias vezes seguidas para ver o que acontece. Observe
que a combinação de comandos ^K^K^Y apaga e recupera uma
linha inteira. Trata-se na realidade de uma operação de ``copy'' que
coloca uma cópia da linha em memória, em um buffer especial. Daí em
diante esta linha pode ser copiada em outros lugares com um simples
^Y, o que é portanto uma operação de ``paste''. Experimente fazer
isto com algumas das linhas do arquivo.
- É possível copiar, cortar e colar quantidades maiores de texto,
movendo-as ou repetindo-as dentro do arquivo. Para fazer isto é
necessário primeiro fazer uma marca lógica em algum lugar do arquivo, ou
seja, definir uma posição de referência. O comando que faz isto é o
``set-mark-command'', executado por ^[Space], que marca a
posição onde está o cursor. Em seguida podemos movimentar o cursor para
outra posição, digamos várias linhas para baixo, cortando então todo o
texto que está entre a posição da marca e a posição do cursor com o
comando ^W. Tente fazer isto com alguma parte do arquivo.
- Mais uma vez, o texto cortado vai para o buffer especial e pode ser
recuperado pelo comando ``yank'', executado por ^Y. Faça
isto para ver como funciona. Assim como antes, o uso repetido de
^Y copiará o texto repetidas vezes no arquivo. Desta forma
pode-se mover ou copiar qualquer quantidade de texto, desde um único
caracter até o texto integral do arquivo. A cópia de blocos de texto com
posteriores pequenas modificações é uma das principais ferramentas para
poupar tempo e trabalho na edição e criação de arquivos, em especial em
trabalhos de programação e de configuração de sistemas.
- Um comando extremamente útil é aquele que permite que você desfaça
mudanças que tenha feito no texto, na ordem inversa daquela em que as
mudanças foram feitas. Toda mudança que você faz no texto é registrada
pelo editor, em blocos de alguns caracteres ou comandos de inserção. O
comando que desfaz as mudanças é o ``undo'', executado através de
(^/). Digite duas ou três linhas quaisquer de texto no arquivo e,
em seguida, use o comando (^/) algumas vezes, até ter eliminado
completamente as mudanças que introduziu.
- Uma outra propriedade muito útil do editor é a sua capacidade de
procurar coisas no texto. O sistema de procura funciona de uma forma
muito interessante, chamada de ``procura incremental''. Comece indo para
o início do arquivo. Para entrar em modo de procura incremental para a
frente, execute o comando ^S (isearch-forward). Digitando
agora uma letra de cada vez, entre a palavra determinant. Observe
como, a cada letra que você digita, o cursor vai até a primeira instância
da combinação de letras que foi formada até aquele momento.
- Para sair do modo de procura você pode usar o comando ^G,
que é a forma de sair de qualquer comando ou modo e voltar ao modo padrão
de inserção. A procura também pode ser feita para trás, de forma
semelhante, com o uso do comando ^R (isearch-backward).
Execute este comando e digite a palavra decompmat, uma letra de
cada vez. Para sair do modo de procura use mais uma vez o comando
^G. Na realidade, você pode sair do modo de procura incremental
digitando qualquer comando do editor, como ^A ou ^E, por
exemplo.
- O comando ^G (keyboard-quit) é a forma universal de
sair de qualquer coisa dentro do editor. Se necessário, use-o mais de uma
vez em seguida. Ele é a saída de emergência de qualquer tipo de enrosco
no qual você acabe se encontrando dentro do editor. Um outro comando
muito útil para você se recuperar de confusões é o comando ^L,
que limpa a tela do terminal e recoloca nele uma nova cópia do conteúdo
do buffer no qual você está trabalhando.
Às vezes pode acontecer da tela do seu terminal ficar confusa ou de algum
outro programa enviar algum output indesejado para ele. Nestes casos use
o comando ^L (recenter) para limpar a tela. Além disso,
este comando é útil para centralizar na tela o trecho do texto onde você
está trabalhando, pois ele irá fazer com que a posição atual do cursor
fique bem no meio dela, da direção vertical. Experimente usar este
comando algumas vezes.
- Como o número de combinações possíveis do tipo ^A,
^B e ^C é limitado, existem certos comandos como, por
exemplo, o comando ^X, que são interpretados como prefixos de
outros comandos e não como comandos completos em si. Assim, ^X é
sempre o início de algum outro comando. Já vimos um caso como este, era o
comando para se sair do editor, ^X^C. Execute-o mais uma vez,
evitando salvar o arquivo ao sair do editor.
- Execute o comando emacs sem argumento. Será aberta pelo
editor uma janela sem conteúdo, correspondente a um buffer de rascunho
chamado ``scratch''. Como trata-se de um rascunho, qualquer conteúdo que
você coloque nele será descartado pelo editor quando você sair, a não ser
que você execute explicitamente um comando para salvar o conteúdo antes
de sair. Vamos então examinar os comandos de leitura e escrita de
arquivos a partir do editor.
- Execute o comando ^X^F (find-file) para ler e
editar um arquivo de dentro do editor. Aparecerá um prompt na última
linha de baixo na janela, abaixo da barra de status que contém algumas
informações sobre o status do editor. Digite neste prompt o nome do
arquivo checkmats.f, que é uma das rotinas usadas no programa decmat, apertando em seguida a tecla [Enter]. Observe como é
criado um novo buffer e o arquivo aparece na tela. Execute mais uma vez o
comando ^X^F e digite no prompt apenas a letra D seguida
de um [Tab]. Você reconhece o comportamento? Aperte [Enter]
para ler mais uma vez o programa principal Decompmat.f. Lembre-se
de que se você quiser sair do comando ^X^F sem de fato
executá-lo, basta usar o comando geral de cancelamento ^G.
- Observe que o programa Decompmat.f aparece mais uma vez na
tela. Entretanto, o conteúdo do buffer referente ao arquivo checkmats.f que estava sendo editado anteriormente não foi perdido, o
buffer continua em memória. Você pode verificar isto usando o botão
esquerdo do mouse para abrir o menu Buffers na barra de menus que
fica no topo da janela do editor. Segurando o botão do mouse e levando o
cursor do mouse até um dos ítens que aparecem no menu fará com que o
buffer correspondente apareça na tela. Observe que alguns buffers
correspondem aos arquivos que você está editando, enquanto outros são
buffers internos do editor. Dê uma olhada em cada um deles.
- Volte para o buffer Decompmat.f. O comando para salvar as
mudanças feitas num buffer é ^X^S, o que vai sobrescrever o
arquivo correspondente no disco. Tente executar este comando. Se você não
fez de fato nenhuma mudança no buffer, vai receber uma mensagem (na linha
de comando abaixo da barra de status de baixo) dizendo que não há o que
salvar. Faça uma mudança qualquer no buffer, por exemplo acrescente
algumas linhas em branco, repetindo em seguida o comando ^X^S.
Desta vez o arquivo será salvo com as mudanças feitas. Saia do editor e
entre de novo com o comando emacs Decompmat.f para verificar isto.
- Caso você tenha feito mudanças mas não queira sobrescrever o
arquivo original, pode escrever o buffer para um novo arquivo, escolhendo
um novo nome para ele. O comando para se escrever um novo arquivo é
^X^W. Aparecerá um prompt na linha de comando, que você poderá
completar com um nome de arquivo de sua livre escolha, apertando em
seguida a tecla [Enter]. Observe que, assim como no caso do comando
^X^F que permite a leitura de um novo arquivo, a tecla [Tab] pode ser usada nesta linha de comando para completar de forma
automática o nome dos arquivos. Naturalmente, isto só é útil neste caso
se você quiser escrever em cima de algum outro arquivo já existente.
Lembre-se de que se você quiser sair do comando ^X^W sem de
fato executá-lo, basta usar o comando geral de cancelamento ^G.
- Já vimos que é possível estar editando com o emacs dois ou
mais arquivos ao mesmo tempo, que estarão em buffers diferentes. Também é
possível mostrar mais de um arquivo simultaneamente na janela. Para isto,
dividimos a janela em duas, que passarão a funcionar como se fossem dois
editores diferentes. O comando para fazer isto é ^X2. Note que
não há tecla de controle no caso do segundo caracter desta sequências.
Deve-se a possibilidade de fazer isto ao fato de que está sendo usado um
caracter de controle no prefixo, o caracter ^X. Execute este
comando, verificando que aparecem de fato duas janelas, uma em cima da
outra, ambas mostrando o mesmo buffer.
- Você pode mudar o seu cursor de uma janela para a outra usando o
mouse (basta clicar na janela) ou o comando ^XO (trata-se da
letra O, não do zero). Faça isto e vá para a janela de baixo. Uma vez lá,
use o comando ^X^F para ler o arquivo Makefile para
dentro desta janela. Pronto, agora você está editando os dois arquivos ao
mesmo tempo. Isto é quase como ter dois editores rodando ao mesmo tempo
no sistema X11, com a diferença de que o que você matar com ^K ou
^W em uma janela poderá ser recuperado na outra, pois o buffer
especial que guarda o texto que foi cortado é o mesmo para as duas
janelas. Experimente fazer isto, trata-se de uma forma muito útil de se
transferir material selecionado de um arquivo para outro. É claro que
isto não é muito útil no nosso caso aqui, pois os dois arquivos são de
natureza muito diferente um do outro. Portanto, desfaça as mudanças que
fizer neles, depois de ter usado os comandos ^K e ^Y.
- Uma coisa importante a saber, como sempre, é como sair desta
situação de duas janelas. Há duas formas de fazer isto. Primeiro, você
pode matar todas as janelas menos aquela na qual está o cursor neste
momento, usando o comando ^X1 (delete-other-windows).
Experimente fazer isto. Note que isto só elimina a janela, não o buffer
que estava nela. Verifique este fato dando uma olhada no menu de buffers
na barra superior de menus. Em seguida execute de novo o comando
^X2 (split-window-vertically) e, estando o cursor na janela
de cima, coloque nela o buffer correspondente ao outro arquivo que
estivemos editando, usando o mouse no menu de buffers. A outra forma de
sair desta situação de duas janelas é eliminar uma janela, aquela na qual
você está no momento, com o comando ^X0 (delete-window).
Experimente fazer isto.
- Em algumas circunstâncias o editor vai automaticamente mostrar uma
segunda janela. Por exemplo, para se pegar um buffer é possível usar,
além do mouse na barra de menus, o comando ^X^B. Este comando
vai mostrar uma lista dos buffers existentes em uma segunda janela que
vai aparecer automaticamente. Clicando o botão do meio do mouse num dos
nomes da lista, ou indo para esta nova janela com ^XO,
movimentando o cursor para cima do nome e apertando [Enter], o
buffer correspondente será colocado na tela. Com a execução do comando
esta segunda janela será fechada automaticamente. Caso você desista de
executar o comando, pode simplesmente fechar a janela com ^X0.
Experimente pegar um novo buffer das duas maneiras descritas acima.
- A pequena janela de uma linha que aparece na linha de comando,
abaixo da linha de status inferior, quando usamos comandos como o
^X^F ou o ^X^W, também é uma janela e podemos
entrar e sair dela usando o comando ^XO, como fazemos com duas
janelas de texto. Use o comando ^X^F para ler algum outro
arquivo e, enquanto a janela de comando estiver aberta, use o comando
^XO para sair e entrar nela. Para terminar abra quatro janelas,
repetindo o comando ^X2 dentro de cada uma de duas janelas que já
existam devido a um ^X2 anterior. Use o comando ^XO para
mudar de janela em janela. Depois elimine todas as janelas e saia do
editor.
- Verifique se há no seu diretório corrente de trabalho arquivos do
tipo #<arquivo># ou <arquivo>~, ou seja, arquivos de
backup indicando que você vez de fato algumas mudanças nos arquivos que
puxou das páginas da disciplina. Se você tiver de fato realizado mudanças
e tentar rodar de novo o comando make, é bem possível que aconteça
algum erro. A forma mais fácil de consertar isto é puxar os arquivos de
novo, de forma que simplesmente apague todos estes arquivos de backup com
comandos como rm *~ e rm #*#.
Next: Problemas e Dicas
Up: FMA 215 Aula 8:
Previous: Arquivos de backup: