WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

Символ табуляции (\t) в textarea при нажатии TAB на клавиатуре

Короткая заметка с JS кодом на основе jQuery, который вставляет символ табуляции \t при нажатии на кнопку TAB в поле textarea.

Горизонтальная табуляция (HT, TAB) — управляющий символ таблицы ASCII с кодом 09, используется для выравнивания текста в строках. Встретив этот символ, терминал перемещает каретку (или курсор) вправо на ближайшую позицию табуляции. Традиционно эти позиции располагаются каждые 8 знакомест, в колонках 1, 9, 17, 25… Вводится при помощи клавиши Tab ⇆ , во многих языках программирования обозначается как \t.

Я описываю функции на этом блоге, и как есть время и хватает знаний, отвечаю на ваши вопросы в комментариях. И в том, и в другом случае, частенько приходится писать коды и очень не хватало возможности вставлять символ \t прямо с клавиатуры, привычной кнопкой TAB. Сегодня решил написать небольшой код, который перехватывает событие нажатия клавиши Tab и вставляет символ \t в поле textarea, в место, где находится курсор.

/**
 * Cимвол \t (tab ⇆ табуляция) в textarea при нажатии tab на клавиатуре.
 *
 * Добавляет началные отсутпы для выделенног текста при нажатии на клавишу `Tab`.
 * Или убирает начальный отступ (4пробела или TAB) при нажании на `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;
}

Поддержка этого свойства браузерами 96% (с префиксами). Не поддерживает только IE. Подробнее данные о поддержке смотрите здесь.

1 коммент