Aplique a cor do rosto com base no número da coluna
-
11-12-2019 - |
Pergunta
Existem os chamados formatos estritos, como pdb - onde o significado do símbolo é definido pelo número da coluna do símbolo.Por exemplo aqui é uma especificação do formato pdb mencionado acima.
Existe uma maneira de aplicar a cor do rosto com base no intervalo de colunas?
Normalmente pode-se adicionar uma regexp para ser destacada, por exemplo, para a sessão atual da seguinte maneira:
(font-lock-add-keywords nil '(("\\[\\(.+?\\)\\]" . font-lock-keyword-face)))
Então, existe uma maneira de especificar essa face nas colunas, digamos 7-11 - deveria ser, digamos - vermelha?
Editar:
Então a resposta é:
(font-lock-add-keywords nil '(("^.\\{2\\}\\(.\\{2\\}\\)" 1 font-lock-warning-face)))
Solução
Defina um regexp que selecionará a coluna apropriada.Por exemplo, para selecionar a terceira coluna (assumindo que as colunas contenham apenas letras para maior clareza do exemplo), você pode fazer algo como "\(?:[a-z]+ \)\{2\}\([a-z]+\)"
e então combine no primeiro grupo.
Claro que você pode criar tal string usando format
e passando alguns argumentos para mais flexibilidade.
(font-lock-add-keywords nil '(("\\(?:[a-z]+ \\)\\{2\\}\\([a-z]+\\)" 1 font-lock-warning-face)))
Como outra direção, o seguinte código foi encontrado no modo de espaço em branco que destaca os caracteres acima de um determinado número:
;; Show "long" lines
(list
(let ((line-column (or whitespace-line-column fill-column)))
(format
"^\\([^\t\n]\\{%s\\}\\|[^\t\n]\\{0,%s\\}\t\\)\\{%d\\}%s\\(.+\\)$"
whitespace-tab-width
(1- whitespace-tab-width)
(/ line-column whitespace-tab-width)
(let ((rem (% line-column whitespace-tab-width)))
(if (zerop rem)
""
(format ".\\{%d\\}" rem)))))
(if (memq 'lines whitespace-active-style)
0 ; whole line
2) ; line tail
whitespace-line t)
Outras dicas
O seguinte aplica a coloração inicialmente ao texto da 7ª à 11ª coluna:
(defun bk-pdb-color-ATOM-initially()
(interactive)
(save-excursion
(goto-char (point-min))
(while (search-forward-regexp "^ATOM \\(.\\{5\\}\\).\\(.\\{4\\}\\).\\(.\\{3\\}\\).\\(.\\{5\\}\\).\\{4\\}\\(.\\{24\\}\\)" nil t)
(progn
(overlay-put
(make-overlay (match-beginning 1) (match-end 1))
'face '(:foreground "blue"))
(overlay-put
(make-overlay (match-beginning 2) (match-end 2))
'face '(:foreground "red"))
(overlay-put
(make-overlay (match-beginning 3) (match-end 3))
'face '(:foreground "purple1"))
(overlay-put
(make-overlay (match-beginning 4) (match-end 4))
'face '(:foreground "orange"))
(overlay-put
(make-overlay (match-beginning 5) (match-end 5))
'face '(:foreground "green"))
t nil)
)))