Arquivo

Posts Tagged ‘emacs’

Emacs personalizado

Printscreen da minha sessão Emacs com as atuais configurações do arquivo .emacs.

Trocando umas idéias com o Fernando Toledo (co-autor do Ridículas) aprendi diversas opções disponíveis para personalizar o Emacs, meu editor de scripts R. A personalização torna a experiência mais agradável, de forma que o usuário pode habilitar ferramentas do editor que proporcionem mais conforto e agilidade. Algumas opções de personalização são os padrões de cores. Eu por exemplo prefiro um fundo preto pois acredito que cansa menos. Numeração na margem é outro aspecto interessante, principalmente para situar pessoas que acompanham algum curso com o R usando o Emacs. O realçador de parenteses é outro recurso que evita perda de tempo na depuração de um código. E coisas como especificar o tamanho de letra e definir como padrão os comandos ctrl-zxcv para desfazer-recortar-copiar-colar evitam de você ter que fazer isso graficamente em toda sessão. Para usar o esquema de cores você vai ter que instalar o emacs-goodies-el

$ sudo apt-get install emacs-goodies-el

Uma vez instalado, o restante das opções você consegue copiando para o seu arquivo .emacs, que fica na sua home (se não existe, crie um), os trechos desejados do meu atual arquivo .emacs

;;;--------------------------------------------------------------------------
;;; arquivo de configuração do Emacs por Walmes Zeviani

;;---------------------------------------------------------------------------
;; faz com que o emacs23 fique no modo de texto visual
;; (quebra de linha visual) quando edita porção tex de um Rnw
(add-hook 'text-mode-hook 'turn-on-visual-line-mode)

;;---------------------------------------------------------------------------
;; faz com que apareceça os argumentos das funções do R no minibuffer
(require 'ess-eldoc)

;;---------------------------------------------------------------------------
;; numeração das linhas na margem esquerda
(global-linum-mode 1)

;;---------------------------------------------------------------------------
;; auxilia na identação do código, colunas coloridas após certa distância
(require 'whitespace)
(setq whitespace-line-column 77)
(setq whitespace-style '(face tabs lines-tail trailing))
(global-whitespace-mode t)

;;---------------------------------------------------------------------------
;; inicia Emacs com ctrl-{zxcv} abilitado para desf/recor/cop/colar
(cua-mode t)

;;---------------------------------------------------------------------------
;; realçador de pareamento de parenteses, chaves, colchetes, aspas...
(show-paren-mode 1)

;;---------------------------------------------------------------------------
;; tamanho da fonte (120~12pt)
;; comandos C-x C-+ e C-x C-- para aumentar e diminiur o tamanho da fonte
(set-face-attribute 'default nil :height 120)

;;---------------------------------------------------------------------------
;; estilo de cores de fundo e fontes, mais disponíveis em
;; http://themes.sweyla.com/
;; http://jasonm23.github.com/emacs-theme-editor/

(defun sweyla838549 ()
  "Theme generated by Sweyla: http://themes.sweyla.com/seed/838549/"
  (interactive)
  (color-theme-install
   '(sweyla838549
     ((background-color . "#010000")
      (foreground-color . "#FFFFFF")
      (background-mode . dark)
      (border-color . "#323232")
      (cursor-color . "#FFFFFF")
      (mouse-color . "#323232"))
     (mode-line ((t (:foreground "#FFFFFF" :background "#323232"))))
     (region ((t (:background "#323232"))))

     (font-lock-comment-face ((t (:foreground "#00FF73"))))
     (font-lock-constant-face ((t (:foreground "#58D3A8"))))
     (font-lock-builtin-face ((t (:foreground "#16AF3D"))))
     (font-lock-function-name-face ((t (:foreground "#82FFD5"))))
     (font-lock-variable-name-face ((t (:foreground "#00FFD2"))))
     (font-lock-keyword-face ((t (:foreground "#3AFFC4"))))
     (font-lock-string-face ((t (:foreground "#04F069"))))
     (font-lock-doc-string-face ((t (:foreground "#04F069"))))
     (font-lock-type-face ((t (:foreground "#00FFFF"))))
     )))

(provide 'sweyla838549)

(require 'color-theme)
(color-theme-initialize)
(sweyla838549)

;;---------------------------------------------------------------------------

Visite os dois links disponíveis na parte de cores. Nesses sites você pode definir um esquema de cores próprios para sua sessão Emacs. Daí é só aproveitar a boa experiência que o Emacs dá à edição de código R e LaTex. A figura no início do post é um printscreen do meu Emacs com essas configurações. Atualmente eu uso o Emacs23 no Ubuntu 12.04. Não esqueça para usar o R com Emacs você precisa instalar o ess

$ sudo apt-get install emacs23 ess

Meus agradecimentos ao Fernando Toledo pelas preciosas dicas. Até a próxima ridícula.

Anúncios
Categorias:linux Tags:

Realçador de código R para blogs

Quem trabalha com programação reconhece que a organização do código facilita muito a releitura e checagem. O R, uma vez que é uma linguagem, possui editores que apresentam recursos para organização do código, como Emacs, RStudio, Tinn-R, Rkward entre diversos. A maioria dos editores apresenta um padrão de identação do código e realçador (highlighter) de texto. A necessidade de divulgação de código R, de forma organizada e atraente, fez com que os realçadores aparecessem nas páginas de blogs, wikis, etc. O wordpress.com possui um realçador de código R nativo. Para quem não tem wordpress.com, pode usar o Pretty R syntax highlighter que possui, além dos realces usuais, links para as páginas de documentação das funções. Abaixo está código R com o realçador do wordpress.com e com o pretty-R. Perceba que as funções (negrito azul) possuem links para página de ajuda.

# importa dados
soja <- read.table("http://www.leg.ufpr.br/~walmes/cursoR/soja.txt",
                   header=TRUE, sep="\t", dec=",")
str(soja)
 
# ajusta um modelo e pede anova
m1 <- aov(rengrao~bloco+agua*potassio, soja)
anova(m1)
 
# cria uma lista com as variáveis resposta
respostas <- do.call(c, apply(soja[,4:7], 2, list))
do.call(c, respostas)
 
# faz o ajuste para todas as respostas
ajustes <- lapply(respostas,
                  function(r){
                    m0 <- aov(r~bloco+agua*potassio, data=soja)
                    m0
                  })
 
# pede todas as anovas
lapply(ajustes, anova)
# importa dados
soja <- read.table("http://www.leg.ufpr.br/~walmes/cursoR/soja.txt",
                   header=TRUE, sep="\t", dec=",")
str(soja)
 
# ajusta um modelo e pede anova
m1 <- aov(rengrao~bloco+agua*potassio, soja)
anova(m1)
 
# cria uma lista com as variáveis resposta
respostas <- do.call(c, apply(soja[,4:7], 2, list))
do.call(c, respostas)
 
# faz o ajuste para todas as respostas
ajustes <- lapply(respostas,
                  function(r){
                    m0 <- aov(r~bloco+agua*potassio, data=soja)
                    m0
                  })
 
# pede todas as anovas
lapply(ajustes, anova)

Created by Pretty R at inside-R.org

Além de no R você fazer praticamente tudo, você pode apresentar de forma elegante. Até a próxima ridícula.

Dicas de como usar o Emacs com o R

O R possui diversos editores (Rkward, JGR, Tinn-R, RStudio, entre outros). O emacs é o meu editor preferido, talvez porque foi com o qual eu comecei a usar o R no Linux. Esse editor possui várias vantagens e nesse post eu vou ressaltar algumas delas.

Para instalar o emacs no linux, você deve ir para o terminal e pedir

$ sudo apt-get install emacs23 ess

O ess é uma componente que deve ser instalada junto com o emacs para que reconheça a linguagem R, aplicando então os realces (highlights) e a indentação do código. Os realces são cores aplicadas ao código que identificam as strings, as funções, os comentários, ajudam a controlar os pares de parênteses/colchetes/chaves, permitindo a rápida identificação de estruturas de hierarquia de funções. A indentação garante um aspecto mais organizado para o código, principalmente para pessoas que fazem funções e desenvolvem pacotes. Um código com indentação fica mais fácil de ser lido por terceiros e permite facilmente a identificação de erros de programação.

Algumas curiosidades sobre o emacs+ess são os atalhos para o sinal de atribuição <- que é obtido com um simples underline. Outra utilidade é a repetição de caracteres que eu uso para traçar linhas horizontais no meu código, separando passos da minha análise. Segure (segura ctrl)+(número de repetições)+(solta ctrl)+(caracter a repetir). Para fazer uma linha comentada com 50 traços é só fazer (segura ctrl)+(50)+(solta ctrl)+(-). O leitor pode perceber que meus códigos R sempre possui esses traços horizontais. Detalhe: aprendi fazer isso acidentalmente.

No emacs existem comandos específicos para recortar/copiar/colar texto. Para ativar os usuais ctrl+x/c/v, você deve ir no menu options e habilitar a opção C-x/C-c/C-v Cut and Paste (CUA).

O emacs possui atalhos para avaliar o código R. Os atalhos mais usuais são:

  • ctrl+c+j — avalia uma linha de código e não muda o cursor para a linha seguinte;
  • ctrl+c+n — avalia uma linha de código e  muda o cursor para a linha seguinte;
  • ctrl+c+p — avalia um parágrafo (região sem quebra de linha no código);
  • ctrl+c+r — avalia uma região selecionada do código;
  • ctrl+c+f — avalia uma função, ignora as quebras de linha.

Ao usar o R no emacs, por padrão a janela é dividida verticalmente. O script fica na porção superior e o console na porção inferior. Para mexer a barra de rolagem do script usa-se as teclas page up e page down. O interessante é que com alt+page up e alt+page down pode-se mexer a barra de rolagem do console sem mudar o cursor para o console. Isso é útil quando queremos rever algum resultado que já ficou escondido no console.

No emacs, ao aplicar uma função do R, é possível previamente saber os argumentos que essa função recebe. Isso e mostrado no buffer inferior (uma linha de buffer). Para isso é necessário que exista um arquivo .emacs na sua home do linux (/home/user) com a seguinte linha

(require 'ess-eldoc)

No linux, todo arquivo/diretório que começa com ponto é oculto. Você pode localiza-lo de forma gráfica no menu ver > mostrar arquivos ocultos, para então abrir com gedit e adicionar a linha. Pode-se fazer isso por terminal, indo para a sua home, listando os arquivos ocultos e abrindo o desejado com o vi. Se o arquivo não existir, você pode criá-lo com o conteúdo desejado usando o comando echo.

$ cd ~                                 # vai para o diretório home do usuário
$ pwd                                  # mostra o diretório para conferir
$ find .emacs                          # encontra o arquivo se ele existir
$ vi .emacs                            # abre o arquivo para edição
$ echo "(require 'ess-eldoc)" > .emacs # cria o arquivo se ele não existir

Feito isso, toda vez que abrir o primeiro parentese da função, vai aparecer os seus argumentos. Por exemplo, para função install.packages() aparece assim

install.packages(
install.packages: pkgs, lib, repos = getOption("repos"), contriburl = contrib.url(repos,
    type), method, available = NULL, destdir = NULL, dependencies = NA,
    type = getOption("pkgType"), configure.args = getOption("configure.args"),
    configure.vars = getOption("configure.vars"), clean = FALSE,
    Ncpus = getOption("Ncpus"), libs_only = FALSE, INSTALL_opts,
    ...

Esse tipo de informação você pode obter com a função args()

args(install.packages)

Para finalizar, o emacs possui três tipos de comentários. Ao usar uma tralha # (hash) e dar enter com o cursor na frente da tralha, o comentário é colocado no centro horizontal do script. Com duas tralhas, os comentários serão alinhados à esquerda no mesmo nível de profundidade do código. Com três tralhas, o comentário sempre vai ficar colado à esquerda. Veja abaixo o exemplo.

                                        # gráfico da lattice
require(lattice)
da <- expand.grid(x=1:20, z=gl(2,1,labels="A"))
da$y <- 0.3*da$x+as.numeric(da$z)+rnorm(da$x)
xyplot(y~x, data=da,
       ## identifica linhas separadas por grupos
       groups=z,
       ## controla cores, tipo de linha
       type="b", col=1:2, lty=1:2, pch=19,
       ## controla a legenda
       key=list(
         ## texto
         text=list(c("A1","A2")),
         ## opções de linha
         lines=list(lty=1:2, col=1:2)
         )
       )
### tentem fazer isso em casa crianças!

Para usuários de windows aconselho baixar o emacs da página do Vincent Goulet.

Categorias:linux Tags:, , , ,