Conoce estos pero quieres algo como
<script> let value = document.getElementById("textarea"); value.indexOf("<") value.lastIndexOf("<") value.nearestIndexOf("<") // how can i do it? </script>No especificó qué se debe seleccionar cuando las distancias son iguales en ambas direcciones, aquí hay un fragmento, que selecciona el índice más cercano del lado izquierdo del signo de intercalación.
const textArea = document.querySelector('textarea'); function nearestOf(char, textArea) { const text = textArea.value, origo = textArea.selectionStart, leftIndex = text.lastIndexOf(char, origo - 1), rightIndex = text.indexOf(char, origo); let distLeft, distRight, indices = { [distLeft = leftIndex < 0 ? Infinity : origo - leftIndex]: leftIndex, [distRight = rightIndex < 0 ? Infinity : rightIndex - origo + 2]: rightIndex }; return indices[Math.min(distRight, distLeft)]; } textArea.addEventListener('input', e => { const s = nearestOf('<', e.target); console.log('nearestOf:', s); }); <textarea></textarea> El código guarda los < caracteres más cercanos del lado izquierdo y derecho del signo de intercalación en las variables Index , las distancias se almacenan en dist variables de distancia y en las claves del objeto de indices . Si no se encuentra el carácter del lado izquierdo, la tecla correspondiente se establece en Infinity y el valor en -1. La misma comprobación se realiza para el carácter del lado derecho. Si no hay el carácter buscado, el objeto de indices contiene solo una única tecla Infinity . La declaración de retorno elige el índice del valor más corto del objeto de indices por las claves que representan las distancias.
La constante de aspecto extraño 2 en distRight asegura que el lado izquierdo se selecciona cuando las distancias son las mismas.