Символ табуляции (\t) в textarea при нажатии TAB на клавиатуре
Короткая заметка с JS кодом на основе jQuery, который вставляет символ табуляции \t при нажатии на кнопку TAB в поле textarea.
Горизонтальная табуляция (HT, TAB) — управляющий символ таблицы ASCII с кодом 09, используется для выравнивания текста в строках. Встретив этот символ, терминал перемещает каретку (или курсор) вправо на ближайшую позицию табуляции. Традиционно эти позиции располагаются каждые 8 знакомест, в колонках 1, 9, 17, 25… Вводится при помощи клавиши Tab ⇆ , во многих языках программирования обозначается как \t.
Я описываю функции на этом блоге, и как есть время и хватает знаний, отвечаю на ваши вопросы в комментариях. И в том, и в другом случае, частенько приходится писать коды и очень не хватало возможности вставлять символ \t прямо с клавиатуры, привычной кнопкой TAB. Сегодня решил написать небольшой код, который перехватывает событие нажатия клавиши Tab и вставляет символ \t в поле textarea, в место, где находится курсор.
GitHub/**
* \t (tab ⇆ tabulation) symbol in textarea when pressing tab on the keyboard.
*
* Adds initial indentation for selected text when pressing the `Tab` key.
* Or removes the initial indentation (4 spaces or TAB) when pressing `Shift + Tab`.
*
* @Author Kama (wp-kama.ru)
* @version 4.3
*/
document.addEventListener( 'keydown', function( event ){
if( 'TEXTAREA' !== event.target.tagName ){
return
}
// not tab
if( event.code !== 'Tab' ){
return
}
event.preventDefault()
// Opera, FireFox, Chrome
let textarea = event.target
let selStart = textarea.selectionStart
let selEnd = textarea.selectionEnd
let before = textarea.value.substring( 0, selStart )
let slection = textarea.value.substring( selStart, selEnd )
let after = textarea.value.substr( selEnd )
let slection_new = ''
// remove TAB indent
if( event.shiftKey ){
// fix selection
let selectBefore = before.substr( before.lastIndexOf( '\n' ) + 1 )
let isfix = /^\s/.test( selectBefore )
if( isfix ){
let fixed_selStart = selStart - selectBefore.length
before = textarea.value.substring( 0, fixed_selStart )
slection = textarea.value.substring( fixed_selStart, selEnd )
}
let once = false
slection_new = slection.replace( /^(\t|[ ]{2,4})/gm, ( mm )=>{
if( isfix && ! once ){
once = true // do it once - for first line only
selStart -= mm.length
}
selEnd -= mm.length
return ''
})
}
// add TAB indent
else {
selStart++
// has selection
if( slection.trim() ){
slection_new = slection.replace( /^/gm, ()=>{
selEnd++
return '\t'
})
}
else {
slection_new = '\t'
selEnd++
}
}
textarea.value = before + slection_new + after
// cursor
textarea.setSelectionRange( selStart, selEnd )
} );
Этот код будет срабатывать для всех textarea на странице, если нужно чтобы было затронуто определенное поле, то измените проверку:
if( 'TEXTAREA' !== event.target.tagName )
Указываем длину (ширину) табуляции в CSS
Когда отступы используются в коде, 8 пробелов довольно много - 4-х пробелов вполне достаточно, к тому же это неписаный стандарт, который используется в текстовых редакторах. Да и язык разметки markdown использует 4 пробела, когда речь идет о коде.
Свойство CSS tab-index дает возможность изменить ширину отступа, заданного с помощью символа табуляции (клавиша Tab). В значении свойства нужно указывать число символов. Например, чтобы изменить ширину табуляции до 4 символов, нужно указать свойство так:
pre {
tab-size: 4;
-o-tab-size: 4;
-moz-tab-size: 4;
}
Поддержка этого свойства браузерами 98% (с префиксами). Не поддерживает только IE. Подробнее данные о поддержке смотрите здесь.