No desenvolvimento com Emacs Lisp, as funções relacionadas a buffers são essenciais para manipular texto e janelas. Este guia explora algumas funções chave, explicando suas definições e como interagir com elas.
Para obter documentação completa sobre qualquer função ou variável, use os comandos describe-function (ligado a C-h f) e describe-variable (ligado a C-h v). O comando xref-find-definitions (ligado a M-.) permite navegar diretamente para o código-fonte de uma função.
Definição Simplificada de uma Função de Início de Buffer
A função beginning-of-buffer é comum para mover o cursor ao início do buffer. Aqui, uma versão simplificada demonstra o conceito básico:
(defun início-do-buffer-simplificado ()
"Move o cursor para o início do buffer;
preserva uma marca na posição original."
(interactive)
(push-mark)
(goto-char (point-min)))
Esta definição inclui um nome de função, lista de parâmetros vazia, documentação, expressão interativa e corpo. O corpo coloca uma marca com push-mark e vai para o ponto mínimo com goto-char.
Definição da Função mark-whole-buffer
A função mark-whole-buffer marca todo o buffer como uma região. Sua definição completa é:
(defun marca-buffer-inteiro ()
"Posiciona o cursor no início e marca o final do buffer."
(interactive)
(push-mark (point))
(push-mark (point-max) nil t)
(goto-char (point-min)))
Primeiro, uma marca é colocada na posição atual. Depois, outrra marca é adicionada no ponto máximo. Finalmente, o cursor vai para o ponto mínimo. Isso seleciona todo o buffer.
Comando append-to-buffer
O comando append-to-buffer copia uma região para outro buffer. Ele usa insert-buffer-substring e envolve lógica complexa:
(defun anexa-a-buffer (destino-buffer início fim)
"Anexa texto do buffer atual a um buffer de destino."
(interactive
(list (read-buffer "Anexar a buffer: "
(other-buffer (current-buffer) t))
(region-beginning) (region-end)))
(let ((buffer-original (current-buffer)))
(save-excursion
(let* ((buffer-alvo (get-buffer-create destino-buffer))
(janelas (get-buffer-window-list buffer-alvo t t))
ponto)
(set-buffer buffer-alvo)
(setq ponto (point))
(barf-if-buffer-read-only)
(insert-buffer-substring buffer-original início fim)
(dolist (janela janelas)
(when (= (window-point janela) ponto)
(set-window-point janela (point))))))))
Esta função lê um nome de buffer interativamente, usa let para armazenar o buffer original, e save-excursion para restaurar o estado. O let* permite variáveis dependentes. A expressão interativa usa read-buffer e region-beginning/region-end.
Para explorar mais, pratique definindo funções como fim-do-buffer-simplificado ou use xref-find-definitions para localziar código-fonte.