Символ табуляції (t) в textarea при натисканні TAB на клавіатурі

Коротка нотатка з JS-кодом на основі jQuery, який вставляє символ табуляції tпри натисканні на кнопку TAB у полі textarea.

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

Я описую функції на цьому блозі, і як час і вистачає знань, відповідаю на ваші запитання в коментарях. І в тому, і в іншому випадку, часто доводиться писати коди і дуже не вистачало можливості вставляти символ прямо з клавіатури, звичною кнопкою TAB. Сьогодні вирішив написати невеликий код, який перехоплює подію натискання клавіші Tab і вставляє символ в поле textarea, в місце, де знаходиться курсор.

/**
 * Символ 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 - для першої лінії тільки
				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. Докладніше про підтримку дивіться тут .

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *