I guess that happens in SynEdit.
SynEdit uses the "lpDx" width feature EtxTextOut
https://learn.microsoft.com/en-us/windows/win32/api/wingdi/nf-wingdi-exttextoutaOn Linux that is emulated (IIRC) by the LCL WS code, which prints the code one char at a time. => which does not work for script languages.
However, without this, many fonts wont be correctly monospaced (at least in my testing, long ago). And that would mean, if you start selecting, and extend the selection letter by letter, then the text on the line starts jumping around... (at least latin based text would...)
To test
components\synedit\syntextdrawer.pp
procedure TheTextDrawer.NewTextOut(X, Y: Integer; fuOptions: UINT;
const ARect: TRect; Text: PChar; ALength: Integer; AnEto: TEtoBuffer);
var
EtoArray: PInteger;
{$IFDEF WINDOWS_LIGATURE}
W: WideString;
Glyphs: array of WideChar;
CharPlaceInfo: GCP_RESULTSW;
{$ENDIF}
begin
if AnEto <> nil then
EtoArray := AnEto.Eto
else
EtoArray := nil;
Remove the if condition and just keep "EtoArray := nil;"