Полностью отключить все авто-отступ

18

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

Пожалуйста, прочтите остальную часть этого вопроса, прежде чем объявить его дубликатом. Все остальные ответы, которые я нашел, предназначены для более целенаправленного отключения отступов. Я действительно хочу полностью отключить все авто-отступы для всей сессии.

Установка electric-layout-modeна nilне работает.

Детали

Иногда мне нравится составлять большие сообщения коммитов Git с помощью моего текстового редактора Windows ASCII. Эти сообщения часто имеют списки маркеров, блоки кода или другие вещи, для которых точное форматирование в моем исходном документе имеет смысл. Моя кодовая база находится в Linux, и я подключаюсь к коробке с помощью только текстового SSH-клиента. Когда Git входит в Emacs для редактирования сообщения фиксации, я хочу иметь возможность скопировать исходное сообщение фиксации в буфер обмена Windows, а затем вставить его с помощью команд вставки Windows. С точки зрения Emacs, я печатаю то, что было найдено в текстовом файле Windows. К сожалению, когда Emacs видит строки с отступами, он добавляет свой собственный автоматический отступ, поэтому я получаю этот огромный треугольник пустого пространства вдоль левого края буфера.

Я использую GNU Emacs 24.3.1.

Временное решение

Мой текущий обходной путь - перенести мой текстовый файл Windows в файловую систему, смонтированную на моем хосте Linux, загрузить файл в Emacs, а затем использовать kill и yank для передачи содержимого. Это немного неуклюже.

пример

Вот пример блока текста:

a

  - b
    c
    d

Вот как это выглядит, когда я вставляю это в Emacs-under-ssh через MSWin paste:

a

  - b
      c
          d

Если я нажму C-h lпосле того, как сделаю пасту, вот что я вижу. Обратите внимание, что переводы строки вводятся с использованием C-j, а не RET.

a C-j C-j SPC SPC - SPC b C-j SPC SPC SPC SPC c C-j
SPC SPC SPC SPC d C-j C-h l
Мистер Фуз
источник
Поскольку некоторые переменные, связанные с отступом, являются локальными по отношению к буферу, должно быть что-то, что запускается после перехвата основного режима - например, возможно [?] hack-local-variables-hook- чтобы по существу отменить то, что другие основные режимы устанавливают как часть их стандартная инициализация. fundamental-modeэто просто маленькая функция внутри simple.el- то есть (kill-all-local-variables) (run-mode-hooks). M-x find-function RET fundamental-mode RET- вы можете изменить / создать свой собственный по мере необходимости; однако, если вы измените имя, оно не будет использоваться некоторыми функциями, поэтому подумайте о том, чтобы сохранить то же имя.
юрист
Emacs имеет эквивалент Vim :set paste? Это в основном говорит «не трогайте вставленный текст в любом случае». Что также включает в себя авто-отступ.
Омаир Маджид

Ответы:

21

Emacs ≤24,3

Нажатие RET не делает отступ по умолчанию (за исключением некоторых режимов программирования, для которых вам необходимо проверить конфигурацию, зависящую от режима, например, «электрические» настройки).

Терминалы Unix обычно вставляют символ возврата каретки, когда содержимое буфера обмена содержит новую строку (представленную символом перевода строки). В Emacs возврат каретки выглядит как RETключ (фактически, RET это символ возврата каретки), а перевод строки выглядит как (есть) C-j.

Однако в вашем случае вставка новой строки приводит к a C-j, который в Emacs связан с командой newline-and-indent. Как видно из названия, эта команда отступает. Я не знаю, есть ли у PuTTY настройка, которую вы можете изменить. Если вы хотите решить проблему на стороне Emacs, есть простой обходной путь, который, я думаю, вы не будете возражать: привязать C-jк newline(так же, как RET).

(global-set-key "\C-j" 'newline)

Emacs ≥24,4

В Emacs 24.4 режим электрического отступа включен по умолчанию. Это глобальный второстепенный режим, поэтому вы можете отключить его везде, позвонив по телефону, (electric-indent-mode 0)и переключаться в интерактивном режиме M-x electric-indent-mode RET.

Вы можете найти эту информацию в руководстве или, просмотрев документацию по команде, вызванной нажатием Return(нажмите C-h k RET).

Вы можете включить его в определенный буфер с помощью electric-indent-local-mode. Некоторые режимы программирования (особенно сторонние) могут иметь свои собственные функции автоматического отступа, которые не соответствуют настройкам режима электрического отступа.

Жиль "ТАК - перестань быть злым"
источник
electric-indent-modeпо умолчанию отключено (это соответствует тому, что вы сказали, потому что я использую Emacs 24.3.1). Включение и выключение не помогает. electric-indent-local-modeне доступен для меня через M-x. Помощь в RETупоминает три параметра: use-hard-newlines, auto-fill-function, и fill-column. Toggling или изменения тех , с помощью M-x use-hard-lines, M-x auto-fill-modeи M-x set-fill-column RET 0 RETне помогают.
Мистер Фуз
@MrFooz Ой, прости, я не обратил внимания на версию Emacs в твоем вопросе. Но тогда я удивляюсь, почему вы получаете автоматический отступ. Хммм. Вы получаете автоматический отступ emacs -q? Пожалуйста, вставьте в Emacs какой-нибудь короткий текст с новой строкой (скажем, fooновой строкой bar) и нажмите C-h l, что вы видите? … f o o RET b a rили … f o o C-j b a rили … f o o RET C-j barили что-то еще? В каком терминале вы запускаете SSH-клиент?
Жиль "ТАК - перестань быть злым"
Я добавил пример текстового сообщения в исходное сообщение. Добавление -qне помогает (например emacs -q -nw --no-desktop). Я вижу C-jвместо RET. Я использую PuTTY 0.63 в качестве моего SSH-клиента. Я вижу то же самое поведение с TERMустановленным на screenи xterm.
Мистер Фуз
@MrFooz Хорошо, поскольку PuTTY отправляет LF, а не CR, вам нужно указать Emacs не делать отступ в LF. Это легко отключить глобально, я отредактировал свой ответ.
Жиль "ТАК ... перестать быть злым"
Спасибо, global-set-keyвзлом исправил проблему. Я придумаю способ настроить мои EDITORпсевдонимы для автоматического вызова его при запуске при редактировании сообщений Git commit. Новые строки вставляются вместо возврата каретки, потому что я настроил мой любимый текстовый редактор Windows для использования концов строк в стиле UNIX вместо оконных.
Мистер Фуз
1

Вы также можете попробовать режим вставки в скобках. Это особенность вашего эмулятора терминала (в данном случае PuTTY, версии 0.63 и выше), который использует escape-последовательности, чтобы сигнализировать, что пользователь что-то вставляет, а затем снова, когда вставка заканчивается. Есть пакет Emacs, bracketed-pasteкоторый вы можете установить, он позволяет Emacs распознавать escape-последовательности и переходить к более безопасной таблице ключей на время вставки. Это не только предотвращает путаницу с отступом, но также предотвращает использование мошеннической вставкой команд в сеансе emacs M-x.

db48x
источник