navigating through replace decoration

When I create a replace decoration that replaces a range of length N, it takes me N arrow key keystrokes to move the cursor past the widget. My widget hides the original text, and displays an icon in place of the text. So the user experience is poor. How to treat the widget as a single character instead?

Try atomicRanges (just give it the same decoration set that holds your replacing decorations).

Thanks. atomicRanges only works with plugins, if I provide decorations using a facet (see note at PluginField::decorations), is there a way to do the same?

Not yet, but it should be possible to set up a tiny plugin that just reads the rangeset from a facet and provides it as atomic ranges.