See TextareaLeftRightShift.html
<h1>Example of left/right shift text in textarea</h1>
<textarea>
hello world
</textarea>
<style>
textarea {
width: 90vw;
height: 90vh;
}
</style>
<script>
window.ta = document.querySelector("textarea")
window.addEventListener("load", e => { ta.focus() })
window.addEventListener("keydown", e => {
let k = e.key.toLowerCase()
let c = e.ctrlKey, a = e.altKey
if( e.metaKey ) return
if( c && a && k == "arrowright" ) {
if( document.activeElement === ta ) {
e.preventDefault()
return shiftRight(ta)
}
}
if( c && a && k == "arrowleft" ) {
if( document.activeElement === ta ) {
e.preventDefault()
return shiftLeft(ta)
}
}
//console.log("unrecog",{e})
})
window.tabstr = " "
function escapeRegExp(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}
function shiftRight(ta) {
let a = ta.selectionStart
let b = ta.selectionEnd
let v = ta.value
while( v[a-1] != "\n" ) {
a -= 1
if( a <= 0 ) { a = 0; break }
}
while( v[b] != "\n" ) {
b += 1
if( b >= v.length ) { b = v.length; break }
}
let left = v.substr(0,a)
let right = v.substr(b)
let mid = v.substr(a,b-a)
let mid1 = mid.replace(/^/m,tabstr)
let nv = left + mid1 + right
ta.value = nv
ta.selectionStart = a
ta.selectionEnd = a + mid1.length
}
function shiftLeft(ta) {
let a = ta.selectionStart
let b = ta.selectionEnd
let v = ta.value
while( v[a-1] != "\n" ) {
a -= 1
if( a <= 0 ) { a = 0; break }
}
while( v[b] != "\n" ) {
b += 1
if( b >= v.length ) { b = v.length; break }
}
let left = v.substr(0,a)
let right = v.substr(b)
let mid = v.substr(a,b-a)
let re = new RegExp("^"+escapeRegExp(tabstr),"m")
let mid1 = mid.replace(re,"")
let nv = left + mid1 + right
ta.value = nv
ta.selectionStart = a
ta.selectionEnd = a + mid1.length
console.log("shift left")
}
</script>