Здесь мы рассказываем основы о том, как ввести текст, сделать
изменения и записать текст в файл. Если эти сведения новы для вас, вы
можете изучить это более легким способом, запустив самоучитель по Emacs.
Чтобы сделать так, запустите Emacs и наберите Control-h t
(help-with-tutorial
).
Чтобы очистить экран и перерисовать изображение, напечатайте C-l
(recenter
).
Чтобы вставить печатные знаки в редактируемый вами текст, достаточно просто набрать их. Таким образом, вводимые вами знаки вставляются в буфер в позиции курсора (то есть в точке; смотрите раздел Точка). Курсор двигается вперед, и весь текст после курсора тоже сдвигается вперед. Если в буфере был текст `FOOBAR', и курсор стоял перед `B', то если вы наберете XX, вы получите `FOOXXBAR' c курсором, оставшимся перед `B'.
Чтобы удалить текст, который вы только что вставили, используйте DEL. DEL удаляет знак перед курсором (а не знак под курсором; этот знак стоит после курсора). Курсор и все знаки, стоящие после него, сдвигаются назад. Поэтому, если вы набрали печатные знаки и затем набираете DEL, набранное отменяется.
Чтобы закончить строку и начать набирать новую, нажмите RET. Это вставит в буфер знак перехода на новую строку. Если точка находится в середине строки, RET разбивает эту строку. Набор DEL, когда курсор находится в начале строки, удаляет предшествующий символ новой строки, соединяя таким образом эту и предшествующую строки.
Emacs может разбивать строки автоматически, когда они становятся слишком длинными, если вы включите специальный второстепенный режим, называемый режимом Auto Fill. Смотрите раздел Заполнение текста, для информации об использовании режима Auto Fill.
Если вы предпочитаете, чтобы знаки текста замещали (перезаписывали) существующий текст, а не сдвигали его вправо, вы можете включить второстепенный режим Overwrite. Смотрите раздел Второстепенные режимы.
Непосредственная вставка работает для печатных знаков и SPC, но
другие знаки действуют как команды редактирования и не вставляют сами
себя. Если вам требуется вставить управляющий знак или знак, код
которого превышает восьмиричное 200, вы должны отменить их особый
смысл, набрав перед ними Control-q (quoted-insert
).
(Название этого знака обычно записывается как C-q для краткости.)
Существует два способа использования C-q:
Когда включена поддержка многобайтных знаков, восьмиричные коды от 0200 до 0377 не являются верными знаками; если вы задаете код из этого промежутка, C-q считает, что вы собираетесь использовать какой-то из наборов знаков ISO Latin-n, и преобразует заданный код к соответствующему коду знаков Emacs. Смотрите раздел Включение поддержки многобайтных знаков. Какой именно набор знаков ISO Latin следует использовать, определяется выбранной вами языковой средой (смотрите раздел Языковые среды).
Чтобы использовать вместо восьмиричных цифр десятичные или
шестнадцатиричные, установите переменную read-quoted-char-radix
равной 10 или 16. Если основание больше десяти, некоторые буквы,
начиная с a, служат частью знакового кода, так же, как и цифры.
Числовой аргумент для C-q указывает, сколько копий знаков с отмененным особым смыслом необходимо вставить (смотрите раздел Числовые аргументы).
Информация для настройки: DEL в большинстве режимов запускает
команду delete-backward-char
; RET запускает команду
newline
, а самовставляющиеся печатные знаки запускают команду
self-insert
, которая вставляет тот знак, который был набран при
ее вызове. Некоторые основные режимы перепривязывают DEL к другим
командам.
Чтобы сделать что-то большее, чем просто вставка знаков, вы должны знать, как двигается точка (смотрите раздел Точка). Простейший способ переместить точку -- воспользоваться курсорными стрелками или щелкнуть левой кнопкой мыши в том месте, куда вы хотите передвинуть точку.
Есть также Control- и Meta-знаки для перемещения курсора. Некоторые из них эквивалентны курсорным стрелкам (они были придуманы в те дни, когда у терминалов еще не было курсорных стрелок, их можно использовать на таких терминалах). Другие делают более сложные вещи.
beginning-of-line
).
end-of-line
).
forward-char
).
backward-char
).
forward-word
).
backward-word
).
next-line
). Эта
команда старается оставить горизонтальную позицию неизменной, чтобы если
вначале вы находились в середине одной строки, то в конце оказались бы в
середине следующей. В случае, если вы находитесь на последней строке
текста, C-n создает новую строку и передвигается на нее.
previous-line
).
move-to-window-line
). Текст при этом не перемещается по экрану.
Числовой аргумент говорит, на какой строке экрана поместить точку. Он
отсчитывает экранные строки от верха окна (нуль для самой верхней).
Отрицательный аргумент отсчитывает строки снизу (-1 для нижней
строки).
beginning-of-buffer
). При аргументе,
равном n, двигает на n/10 от начала. Смотрите раздел Числовые аргументы, для
более подробной информации о числовых аргументах.
end-of-buffer
).
set-goal-column
). В дальнейшем эти команды всегда
переходят на этот столбец в каждой строке, к которой вы передвигаетесь,
или как можно ближе к нему при данном содержимом строки. Этот целевой
столбец остается в силе, пока его не отменят.
Если вы установите переменную track-eol
не равной nil
,
то если точка находится к конце строки, C-n и C-p
передвигают в конец другой строки. Обычно track-eol
равна
nil
. Смотрите раздел Переменные, чтобы узнать, как установить переменные
вроде track-eol
.
Обычно C-n, вызванная на последней строке буфера, добавляет к
буферу новую строку. Если переменная next-line-add-newlines
равна nil
, то C-n вместо этого выдает ошибку (как C-p
на первой строке).
delete-backward-char
).
delete-char
).
kill-line
).
kill-word
).
backward-kill-word
).
Вы уже знаете о клавише DEL, которая удаляет знак перед точкой (то есть перед курсором). Другой ключ, Control-d (C-d для краткости), удаляет знак после точки (тот знак, на котором курсор). Это сдвигает остальной текст на строке влево. Если вы нажмете C-d в конце строки, то эта строка и следующая за ней соединяются.
Чтобы стереть больший кусок текста, используйте ключ C-k, который удаляет целую строку. Если вы нажмете C-k в начале или в середине строки, то он уничтожает весь текст вплоть до конца этой строки. Если вы наберете C-k в конце строки, то он объединяет эту строку со следующей.
Смотрите раздел Удаление и уничтожение, для получения информации о более гибких способах уничтожения текста.
Вы можете удалить все недавние изменения в тексте буфера вплоть до
определенного предела. Каждый буфер записывает изменения отдельно, и
команда отмены всегда относится к текущему буферу. Обычно каждая
команда редактирования создает отдельное вхождение в записи отмены, но
некоторые команды, как например query-replace
, создают несколько
вхождений, а очень простые команды, например самовставляющиеся знаки,
часто объединяются, чтобы сделать процесс отмены менее утомительным.
undo
).
Вы делаете отмену с помощью команды C-x u или C-_. Когда вы впервые даете эту команду, она отменяет последнее сделанное изменение. Точка возвращается к тому месту, где она была до команды, сделавшей изменение.
Последовательное повторение C-_ или C-x u отменяет все более ранние изменения, вплоть до предела доступной информации отмены. Если все записанные изменения уже были отменены, команда отмены печатает сообщение об ошибке и ничего не делает.
Любая команда, отличная от команды отмены, прерывает последовательность команд отмены. Начиная с этого момента предыдущие команды отмены рассматриваются как простые изменения, которые могут быть отменены. Таким образом, чтобы вернуть отмененные вами изменения, наберите C-f или любую другую команду, которая не причиняя вреда прервет последовательность отмен, а затем снова набирайте команды отмены.
Обычная отмена относится ко всем изменениям, сделанным в текущем
буфере. Вы также можете произвести выборочную отмену,
ограниченную текущей областью. Чтобы сделать это, задайте желаемую
область, а затем запустите команду undo
с префиксным аргументом
(значение не играет роли): C-u C-x u или C-u C-_. Это
отменяет самое последнее изменение в области. Чтобы отменить более
ранние изменения, повторите команду undo
(префиксный аргумент не
требуется). В режиме Transient Mark, любое использование undo
,
когда есть активная область, производит выборочную отмену; вам не нужно
задавать префиксный аргумент.
Если вы заметили, что буфер был изменен случайно, простейший путь вернуться в первоначальное состояние -- это набирать C-_ несколько раз, пока не исчезнут звездочки, стоящие в начале строки режима. В этот момент все сделанные вами изменения отменены. Всякий раз, когда команды отмены убирают звездочки из строки режима, это означает, что содержимое буфера стало точно таким же, каким оно было, когда файл был последний раз считан или сохранен.
Если вы не помните, намеренно ли вы изменили буфер, наберите C-_ один раз. Когда вы увидите последнее изменение, которое вы сделали отмененным, вы поймете, было ли это изменение умышленным. Если это была случайность, оставьте его отмененным. Если оно было умышленным, восстановите изменение, как описано выше.
Не все буферы записывают информацию для отмены. Буферы, чьи имена начинаются с пробела, этого не делают. Они используются для внутренних нужд Emacs и его расширений для хранения текста, который обычно не редактируется и не просматривается пользователями.
Вы не можете отменить простое перемещение курсора; только изменения содержимого буфера сохраняют информацию для отмены. Однако, некоторые команды движения курсора устанавливают метку, так что если вы время от времени используете эти команды, вы можете вернуться в окрестности, по которым вы передвигались, с помощью списка пометок (смотрите раздел Список пометок).
Когда информация отмены для какого-то буфера становится слишком
большой, Emacs время от времени (во время сборки мусора) сбрасывает
самые старые сведения. Вы можете указать, сколько информации для отмены
необходимо хранить, с помощью двух переменных: undo-limit
и
undo-strong-limit
. Их значения выражаются в байтах.
Переменная undo-limit
устанавливает гибкий предел: Emacs хранит
данные для отмены достаточного числа команд, чтобы оставаться в этих
границах и, возможно, выйти за них, но не хранит данные для более ранних
команд сверх этого предела. Ее значение по умолчанию равно 20000.
Переменная undo-strong-limit
устанавливает более жесткий предел:
команда, которая увеличивает размер за эту границу, забывается сама.
Значение этой переменной равно по умолчанию 30000.
Вне зависимости от значений этих переменных, самое последнее изменение никогда не сбрасывается, поэтому нет опасности, что сборка мусора, случившаяся сразу после неумышленного большого изменения, помешает вам отменить его.
Причина того, что для команды undo
определены два запускающих
ключа, C-x u и C-_, состоит в том, что эта команда стоит
того, чтобы иметь однознаковый ключ, но на некоторых клавиатурах нет
очевидного способа ввести C-_. C-x u предоставляет
альтернативу, вы можете прямо набрать его на любом терминале.
Описанных выше команд достаточно для создания и изменения текста в буфере Emacs; более продвинутые команды Emacs лишь позволяют делать это проще. Но для того чтобы сохранить любой текст, вы должны поместить его в файл. Файлы -- это именованные единицы текста, которые хранятся операционной системой, чтобы вы могли получить их позже по имени. Чтобы просмотреть или использовать содержимое файла с любой целью, включая редактирование с помощью Emacs, вы должны задать его имя.
Рассмотрим файл с именем `/usr/rms/foo.c'. Для того чтобы
начать редактирование этого файла в Emacs, наберите
C-x C-f /usr/rms/foo.c RET
Здесь имя файла дается как аргумент для команды C-x C-f
(find-file
). Эта команда использует для считывания аргумента
минибуфер, а чтобы завершить аргумент, вы набираете RET
(смотрите раздел Минибуфер).
Emacs подчиняется этой команде, обращаясь к указанному файлу:
создавая буфер, копируя в него содержимое этого файла и затем показывая
вам буфер для редактирования. Если вы изменили этот буфер, вы можете
сохранить новый текст в файле, напечатав C-x C-s
(save-buffer
). Это делает изменения постоянными путем
копирования измененного содержимого буфера снова в файл
`/usr/rms/foo.c'. До этого ваши изменения существуют только внутри
Emacs, а файл `foo.c' не изменяется.
Чтобы создать файл, надо просто обратиться к нему с помощью C-x C-f, как если бы он уже существовал. Emacs создаст пустой буфер, куда вы можете вставить текст, который хотите занести в файл. Реальный файл создается, когда вы сохраняете этот буфер с помощью C-x C-s.
Конечно, об использовании файлов можно узнать гораздо больше. Смотрите раздел Работа с файлами.
Если вы забыли, что делает какая-то клавиша, вы можете выяснить это с
помощью знака справки C-h (или F1, аналога C-h).
Наберите C-h k, а затем имя ключа, о котором вы хотите узнать;
например, C-h k C-n рассказывает все о том, что делает C-n.
C-h -- это префиксная клавиша; C-h k -- просто одна из ее
подкоманд (а именно, команда describe-key
). Другие подкоманды
C-h предоставляют другие виды справки. Наберите C-h дважды,
чтобы получить описание всех возможностей справки. Смотрите раздел Справка.
Здесь рассматриваются специальные команды и приемы создания и удаления пустых строк.
open-line
).
delete-blank-lines
).
Когда вы хотите вставить новую строку текста перед уже существующей,
вы можете сделать это, набрав новую строку текста и за ней RET.
Однако, может оказаться удобнее видеть то, что вы набираете, если перед
этим сперва создать пустую строку, а затем вставить в нее нужный текст.
Это легко сделать, используя клавишу C-o (open-line
),
которая вставляет новую строку после точки, но оставляет точку перед
этой новой строкой. После С-о набирайте текст в новую строку.
С-о F O O дает тот же результат, что и F O O RET, за
исключением конечной позиции точки.
Вы можете создать несколько пустых строк, набрав С-о несколько раз, или задав ей числовой аргумент, чтобы сказать ей, какое количество строк необходимо создать. Смотрите раздел Числовые аргументы, чтобы узать, как это сделать. Если определен префикс заполнения, то команда C-o, когда вы используете ее в начале строки, вставляет на новой строке этот префикс заполнения. Смотрите раздел Префикс заполнения.
Простой способ избавиться от лишних пустых строк -- воспользоваться
командой C-x C-o (delete-blank-lines
). Использование
C-x C-o среди нескольких пустых строк удаляет их все, кроме одной.
C-x C-o на одиночной пустой строке удаляет эту строку. Когда
точка находится на непустой строке, C-x C-o удаляет все пустые
строки после этой непустой строки.
Если вы добавляете слишком много знаков в одну строку, не прерывая ее нажатием RET, то эта строка будет расти и займет две (или более) строки на экране; в крайней правой позиции каждой из занятых строк, кроме последней, будет расположен знак `\'. Знак `\' говорит, что следующая строка экрана не является отдельной строкой в тексте, что это только продолжение строки, слишком длинной для данного экрана. Продолжение также называется переносом строк.
Иногда удобно, чтобы Emacs автоматически вставлял знаки перевода строки, когда строка становится слишком длинной; используйте для этого режим Auto Fill (смотрите раздел Заполнение текста).
Вместо продолжения Emacs может отображать длинные строки усеченными. Это значит, что все знаки, которые не вошли в ширину экрана или окна, не отображаются совсем. Они остаются в буфере, но временно невидимы. В последнем столбце ставится знак `$', а не `\', чтобы информировать о действии усечения.
Усечение вместо продолжения происходит, когда используется
горизонтальная прокрутка, и, возможно, во всех окнах, не занимающих
полную ширину фрейма (смотрите раздел Множество окон). Вы можете включить усечение для
конкретного буфера, установив в нем переменную truncate-lines
не
равной nil
. (Смотрите раздел Переменные.) Изменение значения
truncate-lines
делает его локальным для текущего буфера; до этого
момента действует значение по умолчанию. Начальное значение по
умолчанию -- nil
. Смотрите раздел Локальные переменные.
Смотрите раздел Переменные управления изображением, о других переменных, влияющих на способ отображения текста.
Это команды для получения информации о размере и позиции частей буфера и для подсчета числа строк.
count-lines-region
). Смотрите раздел Пометка и область, чтобы узнать, что такое
область.
what-cursor-position
).
Есть две команды для работы с номерами строк. M-x what-line подсчитывает номер текущей строки и показывает его в эхо-области. Чтобы перейти к строке с заданным номером, используйте M-x goto-line; она спросит у вас номер. Номера строк отсчитываются от единицы с начала буфера.
Вы также можете видеть номер текущей строки в строке режима; Смотрите раздел Строка режима. Если вы сузили буфер, то номер строки в строке режима отсчитывается относительно доступной части (смотрите раздел Сужение).
В противоположность этому, what-page
подсчитывает номер строки
и относительно суженной области, и относительно всего буфера и
показывает оба числа. Смотрите раздел Страницы.
По этому поводу мы могли бы упомянуть М-=
(count-lines-region
), которая печатает число строк в области
(смотрите раздел Пометка и область). Смотрите раздел Страницы, для информации о команде C-x
l, которая считает строки на текущей странице.
Команда С-х = (what-cursor-position
) может быть
использована для узнавания столбца, в котором находится курсор, а также
другой разнообразной информации о точке. Она печатает в эхо-области
строку, которая выглядит следующим образом:
Char: c (0143, 99, 0x63) point=24781 of 31832(78%) column 52
(На самом деле, это результат, полученный, когда точка была перед словом `column' в самом примере.)
Четыре величины после `Char:' описывают знак, следующий за точкой; первое показывает его, а остальные дают его восьмиричный, десятичный и шестнадцатиричный код. Для многобайтного не-ASCII-знака после этих чисел следует `ext' и шестнадцатиричное представление в системе кодирования данного буфера, если эта система кодирования безопасно может представить этот знак в одном байте (смотрите раздел Системы кодирования). Если код знака больше одного байта, Emacs показывает `ext ...'.
После `point=' следует позиция точки, выраженная через количество знаков. Началу буфера присваивается позиция 1, следующему знаку 2 и так далее. Следующее, большее число означает общее число знаков в буфере. Потом в круглых скобках находится позиция, выраженная как процент от общего размера.
После `column' пишется горизонтальная позиция точки, в столбцах от левого края окна.
Если буфер был сужен, и некоторое количество текста в начале и в конце
временно недоступно, то С-х = печатает дополнительный текст,
описывающий текущие границы доступа. Например, команда может показать
такое:
Char: C (0103, 67, 0x43) point=252 of 889(28%) <231 - 599> column 0
где два добавленных числа дают наименьшую и наибольшую допустимые для точки позиции знаков. Доступными являются знаки между двумя этими позициями. Смотрите раздел Сужение.
Если точка находится в конце буфера (или в конце видимой части), в
выводе С-х = не описывается знак, стоящий после точки. Вывод
может выглядеть так:
point=26957 of 26956(100%) column 0
C-u C-x = показывает вместо координат и столбца
дополнительную информацию о знаке: имя набора знаков и коды данного
знака в этом наборе; ASCII-знаки идентифицируются как принадлежащие
набору знаков ASCII
. Кроме того, после `ext' показывается
полный код знака, даже если он занимает больше одного байта. Вот пример
для знака A с акцентом грав из Latin-1, в буфере с системой кодирования
iso-2022-7bit(1):
Char: `A (04300, 2240, 0x8c0, ext ESC, A @) (latin-iso8859-1 64)
В математике и компьютерной практике слово аргумент означает "данные, предоставляемые функции или операции." Вы можете передать любой команде Emacs числовой аргумент (также называемый префиксным аргументом). Некоторые команды интерпретируют аргумент как счетчик повторений. Например, команда C-f с аргументом, равным десяти, передвигает вперед на десять знаков, а не на один. В этих командах отсутствие аргумента эквивалентно аргументу, равному единице. Отрицательные аргументы говорят большинству таких команд, что надо двигаться или действовать в противоположном направлении.
Если на вашей клавиатуре есть клавиша META, простейший способ
установить числовой аргумент -- набрать цифры и/или знак минуса, прижав
клавишу META. Например,
M-5 C-n
передвинула бы на пять строк вниз. Знаки Meta-1, Meta-2, и
так далее, а также Meta-- делают это, так как это ключи,
привязанные к командам (digit-argument
и
negative-argument
), которые определены как передающие аргумент в
следующую команду. Цифры и - с модификатором Control или Control
и Meta также задают числовой аргумент.
Другой способ задать аргумент -- это использовать команду C-u
(universal-argument
), за которой следуют цифры аргумента. С
помощью C-u вы можете набрать цифры аргумента, не удерживая
клавиши-модификаторы; C-u работает на всех терминалах. Чтобы
набрать отрицательный аргумент, введите после C-u знак минус.
Просто знак минуса без цифр обычно обозначает -1.
C-u, за которой следует знак, не являющийся ни цифрой, ни знаком минус, имеет специальный смысл, "умножение на четыре". Она умножает аргумент последующей команды на четыре. Две последовательные C-u умножают его на шестнадцать. Таким образом, C-u C-u C-f передвигает вперед на шестнадцать знаков. Это удобный способ передвигаться вперед "быстро", так как он передвигает вперед примерно на 1/5 всех строк, умещающихся на экране обычного размера. Другие полезные сочетания -- это C-u C-n, C-u C-u C-n (двигает вниз на большой кусок экрана), C-u C-u C-o (создает "много" пустых строк) и C-u C-k (уничтожает четыре строки).
Некоторым командам важно только присутствие или отсутствие аргумента,
но не его значение. Например, команда M-q (fill-paragraph
)
без аргумента заполняет текст, а с аргументом вдобавок выравнивает текст
по правой границе. (Смотрите раздел Заполнение текста, для более подробной информации о
M-q). Просто C-u дает удобный способ предоставления
аргументов для таких команд.
Некоторые команды используют аргумент в качестве счетчика повторений,
но их действия с аргументом и без него имеют некоторые специфические
черты. Например, команда C-k (kill-line
) с аргументом
n уничтожает n строк, включая ограничивающие их знаки новой
строки. Но C-k без аргумента действует по-другому: она уничтожает
текст вплоть до перевода строки, или, если точка стоит как раз в конце
строки, уничтожает перевод строки. Таким образом, две команды C-k
без аргумента могут уничтожить непустую строку, аналогичные результаты
можно получить, набрав команду C-k с аргументом, равным единице.
(Смотрите раздел Удаление и уничтожение, для более подробной информации о C-k.)
Несколько команд трактуют простую C-u не так, как обыкновенный аргумент. Некоторые другие команды могут различать аргумент в виде просто знака минус и аргумент -1. Эти необычные случаи будут описаны, когда придет черед этих команд; они возникают всегда по причинам удобства использования отдельных команд.
Вы можете использовать числовой аргумент для вставки нескольких копий одного знака. Это работает прямо, если только знак -- не цифра; например, C-u 6 4 a вставляет 64 копии знака `a'. Но это не работает для вставки цифр; C-u 6 4 1 задает аргумент 641, а не вставляет что-либо. Чтобы отделить цифру от аргумента, наберите еще один C-u; например, C-u 6 4 C-u 1 на самом деле вставляет 64 копии знака `1'.
Мы используем термин "префиксный аргумент", как и "числовой аргумент", чтобы подчеркнуть, что вы набираете эти аргументы перед командой, и чтобы отличить эти аргументы от аргументов минибуфера, которые пишутся после команды.
Команда C-x z (repeat
) предоставляет еще один способ
повторить команду Emacs несколько раз. Эта команда повторяет предыдущую
команду Emacs, какая бы она ни была. При повторении команда использует
те же аргументы, какие у нее были раньше; она не считывает новые
аргументы каждый раз.
Чтобы повторить команду несколько раз, напечатайте еще знаки z: каждый знак z повторит эту команду еще один раз. Повторение заканчивается, когда вы вводите знак, отличный от z, или нажимаете кнопку мыши.
Предположим например, что вы напечатали C-u 2 0 C-d, чтобы удалить 20 знаков. Вы можете повторить эту команду (вместе с ее аргументом) еще три раза, чтобы удалить в общей сложности 80 знаков, напечатав C-x z z z. Первый C-x z повторяет эту команду один раз, а каждый последующий z повторяет еще раз.