Como posso determinar se o caractere atual é uma letra (um caractere alfabético) (isto é, pertence à classe de sintaxe [:alpha:]
nas noções de expressão regular). Gostaria de escrever uma função simples como abaixo:
(defun test-letter () (interactive)
(if char-after-is-a-letter
(message "This is a letter")
(message "This is not a letter")
)
)
Atualização
Infelizmente, minha suposição sobre a equivalência da classe das letras e da classe da sintaxe [:alpha:]
parece ser falsa.
elisp
characters
Nome
fonte
fonte
۱۲۳۴۵۶۷۸۹۰
mas existem alguns negativos verdadeiros, por exemplo, árabe ou hebraico Alef:א
,ا
.五
é considerado como o número5
em japonês. Seu código considera isso uma carta. Talvez seja uma letra (como em número romanov
). Talvez alguém familiarizado com o japonês possa verificar isso.五
é como a palavra em inglêsfive
, por isso é uma letra. Ao escrever o número 5, em vez da palavra cinco, eles usam5
exatamente como o inglês.EDIT: Esta resposta deve ser perfeitamente válida em 25.5 (onde o bug foi corrigido). Para versões mais antigas, use a outra opção .
Isso deve indicar se o caractere atual é uma letra e deve funcionar em qualquer idioma.
fonte
looking-at-p
usado na sua solução elooking-at
na outra resposta.looking-at-p
não define dados de correspondência.match-string
(e seus muitos irmãos) retornará o resultado da pesquisa. Enquanto isso, com a versão não predicada, a sequência de caracteres retornará o resultado da correspondência visual.Eu acho que você pode se safar com isso:
Atualizar
Isso é menos eficiente, mas mais próximo do que você deseja:
fonte
۹
(ou seja, o dígito indiano 9) ou٪
como uma letra.ζ
ouα
), mas a atualização não é.Caso você estivesse muito preocupado com os caracteres nacionais e com o tratamento preciso das classes de caracteres Unicode, a única solução que encontrei até agora é a
regex
biblioteca Python . Ambosgrep
ePerl
(para minha total surpresa!) Não fizeram o trabalho corretamente.Assim, a expressão regular que você está depois é este:
\p{L}
. Isso é conhecido como versão abreviada da propriedade Unicode, a versão completa é\p{Letter}
ou mesmop\{General_Category=Letter}
.Letter
é uma classe composta, mas não vou entrar em detalhes, a melhor referência que pude encontrar sobre o assunto está aqui .A biblioteca Python não está embutida na linguagem (é uma alternativa à
re
biblioteca embutida ). Então, você precisaria instalá-lo, por exemplo:Então, você pode usá-lo da seguinte maneira:
Você também pode colocar esse script em algum lugar onde você pode acessá-lo:
E chame-o do Emacs assim (suponha que você tenha salvo esse script
~/bin
):fonte