Emacs запоминает выделение текста - PullRequest
4 голосов
/ 19 июля 2010

Я решил, что готов попробовать что-то новое, после нескольких лет использования gEdit для большинства моих потребностей в кодировании, и попробовать освоить Emacs. Я знал, что это будет сложно, так как я слышал, насколько сложным может быть Emacs, но меня привлекла его мощь. Сложнее всего было привыкнуть писать ELisp в файле .emacs, чтобы что-то изменить в редакторе. В настоящее время я не могу сделать это сам, но я нашел несколько полезных фрагментов здесь и там, чтобы изменить некоторые параметры.

Одна проблема, с которой у меня было много проблем, - заставить Emacs запомнить текст, который я выбрал после команды. Например, я обычно выделяю фрагмент кода, чтобы сделать его массовым отступом. Однако, если я сделаю это в Emacs, он переместит выделенный текст только один раз, прежде чем отменить выбор всего текста. Кто-нибудь знает способ обойти это?

В любом случае, я прошу прощения за то, что мне кажется легким вопросом, но после часа поиска в Google и осмотра здесь на SO, я подумал, что стоит спросить. У меня есть еще несколько вопросов об Emacs, но я сохраню их и спрошу отдельно после того, как исправлю это. Спасибо!

UPDATE

Несколько человек спросили о том, какой мод я использую и какой тип текста я ввожу. Хотя я не очень разбираюсь в режимах Emacs, сейчас я редактирую чистый текстовый файл. Примерно так:

Hello, I am a simple text file
that is made up of three separate 
lines.

Если я выделю все три строки и нажму TAB, я получу это:

    Hello, I am a simple text file
    that is made up of three separate 
    lines.

Это здорово, однако, если я использую C-x C-x, как некоторые предлагают ниже, чтобы повторно выбрать текст и снова нажимаю TAB, я получаю это:

        Hello, I am a simple text file
            that is made up of three separate 
                lines.

Надеюсь, это поможет!

Ответы [ 5 ]

8 голосов
/ 19 июля 2010

FWIW, вот причина поведения вашего недавно добавленного примера.(Я не «решаю» проблему здесь, но я публикую ее, чтобы демистифицировать то, что вы видите.)

Это было определено с помощью emacs -q, который отключает мои настройки, так что по умолчанию следующееповедение для emacs 23.2.

  1. Вы находитесь в текстовом режиме.Вы должны увидеть (Text) или аналогичный в строке режима в нижней части экрана, а C-h m скажет вам (под списком второстепенных режимов): «Режим текста: основной режим для редактирования текста, написанного для чтения людьми».Emacs решает (посредством переменной auto-mode-alist), что он должен переключиться в текстовый режим, если вы посещаете имя файла, соответствующее определенным расширениям (например, .txt).

  2. В тексте-режим нажатия клавиши 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 в каждой строке».

  3. indent-according-to-mode проверяет переменную indent-line-function, которая имеет локальное значение буфера indent-relative.

  4. Используйте 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) часто приводят к полезным решениям проблем, с которыми вы сталкиваетесь.

2 голосов
/ 19 июля 2010

Попробуйте набрать Cx Cx после того, как Emacs отменит его выборку.

Затем, вместо того, чтобы нажимать tab (я никогда не знал, что tab делает то, что вы сказали! Это совершенно сбито с толку.), Выполните M-8 C-x C-i.Жаль, что это так много ключей, но он должен делать то, что вы хотите, а именно, пихать все за 8 столбцов.Замените M-8 на что-то другое, если вам нужно другое количество столбцов.

1 голос
/ 21 июля 2010

Вы можете сделать это следующим образом:


(add-hook 'text-mode-hook (lambda ()
                            (set (make-local-variable 'indent-region-function)
                                 (lambda (s e)
                                   (indent-rigidly s e tab-width)))))

Затем выберите регион и нажмите TAB. будет отступать область на ширину табуляции. Затем вы можете поменять точку и отметить с помощью C-x C-x и снова нажать TAB, чтобы повторить.

Я, однако, согласен с предыдущими ответами, которые предлагают использовать indent-rigidly напрямую.

1 голос
/ 19 июля 2010

Обычно я просто набираю C-x C-x (exchange-point-and-mark) после команды, которая деактивирует регион.

1 голос
/ 19 июля 2010

Как вы делаете отступ, и в каком режиме?

Правила отступов в любом режиме программирования, как правило, должны быть правильными.(Если они этого не делают, это, вероятно, более показательно, что вы хотите настроить правила для этого режима по-другому, но я подозреваю, что это другой вопрос, который уже задавался).

Если вы в тексте -режим или аналогичный и просто с помощью TAB, тогда я вижу проблему.

Обратите внимание, что если вы используете indent-rigidly (C-x C-i или C-x TAB, что то же самое), то вы может многократно отступать в одну и ту же область, просто повторяя команду, даже если подсветка исчезла из вида.

Вы также можете использовать префикс arg для indent-rigidly, чтобы сделать его многократным отступом.Например, C-u C-u C-x C-i (проще набирать, чем выглядит) будет иметь отступ в 16 пробелов (4 x 4, так как префикс arg по умолчанию равен 4, и он умножается на каждый повтор).Аналогично, M-8 C-x C-i отступ в 8 пробелов.Это хорошо в некоторых обстоятельствах и слишком громоздко в других.

Лично я предлагаю добавить (cua-selection-mode 1) в ваш .emacs и использовать это для жесткого отступа. Трей Джексон сделал удобный блог об этом .При этом вы можете C-RET начать выделение прямоугольника, down столько строк, сколько вам нужно, TAB несколько раз для отступа линий и C-RET для выхода из режима.

Пока прямоугольникактивен, RET циклически проходит по углам.Для левых углов, печатать вставки спереди.Для правых углов вводим вставки после.Для прямоугольника с одним столбцом нижняя часть считается «левой», а верхняя - «правой» для этой цели.

В блоге Трея перечислены все доступные функции (или посмотрите исходный файл: cua-base.el)

Имейте в виду, что отступы в Emacs обычно неожиданно сложная тема .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...