+(defvar ggtags-tag-overlay nil)
+(defvar ggtags-highlight-tag-timer nil)
+(make-variable-buffer-local 'ggtags-tag-overlay)
+
+(defun ggtags-highlight-tag-at-point (buffer)
+ (when (eq buffer (current-buffer))
+ (unless (overlayp ggtags-tag-overlay)
+ (setq ggtags-tag-overlay (make-overlay (point) (point)))
+ (overlay-put ggtags-tag-overlay 'ggtags t))
+ (let* ((bounds (bounds-of-thing-at-point 'symbol))
+ (valid-tag (when bounds
+ (member (buffer-substring (car bounds) (cdr bounds))
+ (ggtags-tag-names))))
+ (o ggtags-tag-overlay)
+ (done-p (lambda ()
+ (and (memq o (overlays-at (car bounds)))
+ (= (overlay-start o) (car bounds))
+ (= (overlay-end o) (cdr bounds))
+ (or (and valid-tag (overlay-get o 'face))
+ (and (not valid-tag) (not (overlay-get o 'face))))))))
+ (cond
+ ((not bounds)
+ (overlay-put ggtags-tag-overlay 'face nil)
+ (move-overlay ggtags-tag-overlay (point) (point)))
+ ((not (funcall done-p))
+ (move-overlay o (car bounds) (cdr bounds))
+ (overlay-put o 'face (and valid-tag 'ggtags-highlight)))))))
+
+(defun ggtags-post-command-function ()
+ (when (timerp ggtags-highlight-tag-timer)
+ (cancel-timer ggtags-highlight-tag-timer))
+ (setq ggtags-highlight-tag-timer
+ (run-with-idle-timer 0.2 nil 'ggtags-highlight-tag-at-point
+ (current-buffer))))
+