Aqui está o que eu tenho:
(defun my-show-duplicate-lines ()
(interactive)
(highlight-lines-matching-regexp
(concat "^"
(regexp-quote
(substring-no-properties
(thing-at-point 'line) 0 -1))
"$")
font-lock-warning-face))
Minha intenção é adicionar isso para post-command-hook
encontrar linhas nas quais estou duplicando a lógica, mas quando executo o comando pela segunda vez, é ineficaz (e o antigo bloqueio de fonte ainda está em vigor).
O segundo problema é causado pelo bloqueio de fonte não se atualizar. Eu tentei adicionar um (font-lock-mode -1) (font-lock-mode 1)
à definição, mas era ineficaz.
Não tenho idéia do motivo pelo qual o comando seria bom apenas para uma corrida.
highlight-lines-matching-regexp
interior(let ((hi-lock-mode -1)) .. )
. Eu fiz isso para resolver o mesmo problema: github.com/kaushalmodi/.emacs.d/blob/...unhighlight-regexp
também pode ser usado. Independentemente, esse recurso provavelmente é melhor implementado usando uma função de correspondência de bloqueio de fonte que varre o buffer em busca de linhas duplicadas e aplica realce a elas. Isso lidaria com a remoção de destaque automaticamente quando não houver linhas duplicadas.highlight-lines-matching-regexp
deve ser aplicável a este caso - é quase um entrave . (Embora eu também pensei sobre o uso de sobreposições, mas isso é um conceito que eu sou menos familiarizados com.)delete-duplicate-lines
e depois diferenciar dois buffers.Respostas:
Dê uma olhada
font-lock-keywords
depois de ter chamado sua função. Você verá que ele apenas possui o regexp para a primeira linha como o regexp para tipificar. Tudo o que você fez foi pegar uma determinada linha e colocar um regexp para combiná-lafont-lock-keywords
- para que apenas os dups dessa linha sejam destacados. IOW, o regexp para essa primeira linha é codificadofont-lock-keywords
.Em vez disso, você pode usar um
FUNCTION
infont-lock-keywords
. Mas eu procuraria no buffer por dups de cada linha, por sua vez, e não me incomodariafont-lock-keywords
.Aqui está uma solução rápida. Ele usa a função
hlt-highlight-region
da biblioteca Highlight (highlight.el
), mas você pode usar outra coisa, se quiser.E aqui está uma versão que funciona (a) na região ativa ou (b) no buffer completo se a região não estiver ativa:
E se você quiser uma face diferente para cada conjunto de cópias de segurança , basta vincular uma variável
face
nolet
, esetq
ao(hlt-next-face)
lado de ondeline-re
está definido, e substituafont-lock-warning-face
porface
. A opçãohlt-auto-face-backgrounds
controla as faces usadas.fonte
setq: Symbol's value as variable is void: hlt-highlight-line-dups-ignore-regexp
. Como essa variável é definida?Que tal usar sobreposição em vez de bloqueio de fonte?
Crie região e, em seguida,
M-x my-highlight-duplicate-lines-in-region
você pode limpar todas as sobreposiçõesM-x ov-clear
fonte
Isso é um pouco superficial, mas com algum esforço (consulte C-h f
ediff-buffers
RETas informações sobre oHOOK
argumento) você pode fazer com que ele seja exibido melhor / faça uma limpeza melhor ao sair do modo diff:fonte
Melhoria na resposta acima por Shingo Fukuyama.
Esta versão verifica se há linhas duplicadas na região ativa, mas se não houver nenhuma, pesquisa o buffer inteiro.
fonte