Como faço para acessar o conteúdo da região atual em Emacs Lisp?
Pergunta
Eu quero acessar o conteúdo da região atual como uma string dentro de uma função. Por exemplo:
(concat "stringa" (get-region-as-string) "stringb")
Graças
Ed
Solução
buffer-substring
juntamente com region-beginning
e region-end
pode fazer isso.
Outras dicas
Como starblue diz, (buffer-substring (mark) (point))
retorna o conteúdo da região, se a marca está definido. Se você não quer que o propriedades de cadeia , você pode usar a variante 'buffer-substring-no-properties
.
No entanto, se você está escrevendo um comando interativo, há uma maneira melhor para obter os pontos finais da região, utilizando o formulário (interactive "r")
. Aqui está um exemplo de simple.el
:
(defun count-lines-region (start end) "Print number of lines and characters in the region." (interactive "r") (message "Region has %d lines, %d characters" (count-lines start end) (- end start)))
Quando chamado a partir do código Lisp, a forma (interactive ...)
é ignorado, assim você pode usar esta função para contar as linhas em qualquer parte do buffer, não apenas a região, passando os argumentos apropriados: por exemplo, (count-lines-region (point-min) (point-max))
para contar as linhas na parte estreitada do tampão. Mas quando chamado de forma interativa, a forma (interactive ...)
é avaliada, e os suprimentos de código "r"
o ponto ea marca, como dois argumentos numéricos, ascendente.
Veja as Emacs Lisp manuais, seções 21.2.1 Usando Interactive e 21.2.2 caracteres de código para interativo.
Se você quiser copiar o conteúdo região em um código Lisp para uma estrutura de dados acessível ao usuário como kill-anel, X prancheta ou registar-se, manual Emacs Lisp recomenda a utilização filter-buffer-substring
em vez de simplesmente buffer-substring
. Antes de copiar, a função se aplica funções de filtro a partir de uma variável de lista denominada filter-buffer-substring-functions
. A função foi adicionado na versão 22.3 .