FWIW, вот причина поведения вашего недавно добавленного примера.(Я не «решаю» проблему здесь, но я публикую ее, чтобы демистифицировать то, что вы видите.)
Это было определено с помощью emacs -q
, который отключает мои настройки, так что по умолчанию следующееповедение для emacs 23.2.
Вы находитесь в текстовом режиме.Вы должны увидеть (Text)
или аналогичный в строке режима в нижней части экрана, а C-h m
скажет вам (под списком второстепенных режимов): «Режим текста: основной режим для редактирования текста, написанного для чтения людьми».Emacs решает (посредством переменной auto-mode-alist
), что он должен переключиться в текстовый режим, если вы посещаете имя файла, соответствующее определенным расширениям (например, .txt
).
В тексте-режим нажатия клавиши TAB с выделенной областью вызывает indent-according-to-mode
, который вызывается в каждой строке области последовательно.Немного запутанный путь для выяснения этого начинается с C-h k TAB
, что говорит нам о том, что TAB связан с indent-for-tab-command
, что в данном случае вызывает indent-region
- это имя функции не указано явно в справке, но может бытьвидно в коде - который проверяет локальную для буфера переменную indent-region-function
, которая равна nil, и: «Значение nil означает, что в действительности выполняется indent-according-to-mode
в каждой строке».
indent-according-to-mode
проверяет переменную indent-line-function
, которая имеет локальное значение буфера indent-relative
.
Используйте C-h f indent-relative RET
для просмотра справки по этой функции.(Прочтите это).
Хотя у вас, вероятно, еще не было опыта, чтобы узнать, как все это проверить (или обязательно захотеть!), И полностью понять все, что он говоритВы, это пример того, как самодокументируемый аспект Emacs позволяет пользователю выяснить, что происходит (что затем делает возможным что-то изменить).Я просто использовал C-h k
(ключ описания), C-h f
(функция описания) и C-h v
(переменная описания), чтобы следовать документации.Смотреть на исходный код indent-for-tab-command
было так же просто, как щелкнуть имя файла, показанное на его странице справки.
Я предлагаю сделать следующее, чтобы увидеть, что происходит, когда indent-relative
выполняется в каждой строке.:
M-x set-variable x-stretch-cursor t
M-x set-variable ruler-mode-show-tab-stops t
M-x ruler-mode
Теперь для каждой очереди по очереди поместите курсор в самое начало строки и нажмите клавишу TAB.Вы получите все три строки с отступом от первой табуляции ('T' в линейке).
Теперь повторите это - снова, убедитесь, что вы находитесь в самом начале каждой строки, вперед существующим отступом.
Первый символ первой строки (которая в настоящее время является табуляцией) еще раз имеет отступ перед первым символом табуляции, так как нет предшествующей строки для его изучения.
Затем первый символ второй строки имеет отступ, соответствующий позиции первого непробельного символа предыдущей строки.Поскольку первый символ второй строки также является вкладкой, фактический текст второй строки перемещается на одну вкладку дальше.
Третья строка следует примеру.Его первый символ табуляции выровнен с первым непробельным символом второй строки с тем же относительным эффектом, что и раньше, давая вам окончательное состояние в вашем примере.
Чтобы подчеркнуть, обратите внимание, что происходитесли вы сейчас поставите, введите строку «abc» над существующими строками, затем вернитесь к началу следующей строки (которая ранее была первой строкой) и нажмите клавишу TAB.Первый символ табуляции теперь будет иметь отступ в соответствии с буквой «b».При условии, что переменная indent-tabs-mode
имеет значение true (имеется в виду, что у вас есть действительные символы табуляции), это не окажет практического влияния на положение слов в строке, поскольку «отступ» для табуляции с пробелами не будет действовать до тех пор, покаколичество пробелов превышает ширину табуляции (но это совсем другой котелок рыбы!)
Все это действительно означает, что text-mode
в Emacs не ведет себя так, как вам бы хотелось в этомситуация.Конечно, другие основные режимы могут делать совершенно разные вещи, когда вы нажимаете клавишу TAB.
Как и в случае с Emacs, вещи, которые вам не нравятся, можно изменить или обойти с помощью elisp. Некоторые поиски (особенно в Emacs Wiki) часто приводят к полезным решениям проблем, с которыми вы сталкиваетесь.