For setting the color and shape of the cursor I wrote this code: (setq evil-default-cursor #'ofv/evil-cursor) (defun ofv/evil-cursor () "Change cursor color according to evil-state." (setq cursor-type (if (eq evil-state 'visual) 'hollow 'box)) (set-cursor-color (case evil-state ('insert "dark orange") ('emacs "sienna") ('visual "white") (otherwise "green")))) The color is correctly updated, but not the shape: apparently it still uses the default shapes (box for normal, bar for insert, etc). Looking at evil-refresh-cursor I see that it ends with (evil-set-cursor default) (evil-set-cursor cursor) The second call to evil-set-cursor seems to override the first one, where the value obtained from evil-default-cursor is used. I see no easy fix for that, because `default' might contain shape and color, or only one of those, or nil (because evil-default-cursor contains a function that does all the job.)