There is :h diff_hlID() function you can use to identify what diff highlighting is under cursor.
Following is the example of jumping to next/previous change within diff (probably not super efficient).
NextChange
- first loop is to find next non diffchange character (if cursor is on diff change already, we want to go to the end of it)
- second loop is to find the actual next diffchange
PrevChange is the same in the opposite direction.
The return value of diff_hlID is either 31 or 32 for a diff change -- I just executed it with :echo diff_hlID(line('.'), col('.')) when my cursor was on the diff change. You can probably use synIDattr() to compare against highlight names, didn't try it myself. (update, it is better to use either synIDattr or hlID as the return value of diff_hlID might be different in different environments, example code is updated too)

Note, it goes a bit further as it puts cursor on the actual change not the start of the whole change block...
vim9script def NextChange() if !&diff return endif var line = line('.') var col = col('.') while synIDattr(diff_hlID(line, col), "name") =~ 'DiffText.*' && line <= line('$') col += 1 if col > len(getline(line)) line += 1 col = 1 endif endwhile while synIDattr(diff_hlID(line, col), "name") !~ 'DiffText.*' && line <= line('$') col += 1 if col > len(getline(line)) line += 1 col = 1 endif endwhile if synIDattr(diff_hlID(line, col), "name") =~ 'DiffText.*' cursor(line, col) endif enddef def PrevChange() var line = line('.') var col = col('.') while synIDattr(diff_hlID(line, col), "name") =~ 'DiffText.*' && line >= 1 col -= 1 if col < 1 line -= 1 col = len(getline(line)) endif endwhile while synIDattr(diff_hlID(line, col), "name") !~ 'DiffText.*' && line >= 1 col -= 1 if col < 1 line -= 1 col = len(getline(line)) endif endwhile if synIDattr(diff_hlID(line, col), "name") =~ 'DiffText.*' cursor(line, col) endif enddef nnoremap <silent> ]x <scriptcmd>NextChange()<CR> nnoremap <silent> [x <scriptcmd>PrevChange()<CR>
Updated version with use of hlID and skip of the lines that are not in DiffChange:
vim9script def IsDiffChange(line: number, col: number): bool return [ hlID("DiffChange"), hlID("DiffText"), hlID("DiffTextAdd") ]->index(diff_hlID(line, col)) != -1 enddef def IsDiffText(line: number, col: number): bool return [ hlID("DiffText"), hlID("DiffTextAdd") ]->index(diff_hlID(line, col)) != -1 enddef def NextChange() if !&diff return endif var line = line('.') var col = col('.') while IsDiffText(line, col) && line <= line('$') col += 1 if col > len(getline(line)) line += 1 col = 1 endif endwhile while !IsDiffText(line, col) && line <= line('$') col += 1 if col > len(getline(line)) line += 1 col = 1 while !IsDiffChange(line, col) && line <= line('$') line += 1 endwhile endif endwhile if IsDiffText(line, col) cursor(line, col) endif enddef def PrevChange() if !&diff return endif var line = line('.') var col = col('.') while IsDiffText(line, col) && line >= 1 col -= 1 if col < 1 line -= 1 col = len(getline(line)) endif endwhile while !IsDiffText(line, col) && line >= 1 col -= 1 if col < 1 line -= 1 col = len(getline(line)) while !IsDiffChange(line, col) && line >= 1 line -= 1 col = len(getline(line)) endwhile endif endwhile if IsDiffText(line, col) cursor(line, col) endif enddef nnoremap <silent> ]x <scriptcmd>NextChange()<CR> nnoremap <silent> [x <scriptcmd>PrevChange()<CR>