Повністю вимкнути всі автоматичні відступи


18

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

Будь ласка, прочитайте решту цього питання, перш ніж оголосити його дублікатом. Усі інші відповіді, які я знайшов, стосуються набагато більш цілеспрямованого відключення відступу. Я дуже хочу повністю відключити всю автоматичну відступ на весь сеанс.

Установка electric-layout-modeдля nilне працює.

Деталі

Іноді мені подобається складати великі повідомлення Git počin з моїм текстовим редактором 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:

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's :set paste? В основному це говорить "жодним чином не торкайтеся вставленого тексту". Що також включає автоматичне відступ.
Омаїр Маджід

Відповіді:


21

Emacs ≤24.3

Натискання клавіші RET не відступає за замовчуванням (за винятком деяких режимів програмування, для яких потрібно перевірити конфігурацію режиму, наприклад, "електричні" настройки).

Термінали Unix зазвичай вставляють символ повернення каретки, коли вміст буфера обміну містить новий рядок (представлений символом подачі рядка). У Emacs повернення каретки виглядає як RETключове (насправді RET це символ повернення каретки), тоді як подача рядків виглядає як (є) C-j.

Однак у вашому випадку вставка нового рядка призводить до того 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. Нові рядки вставляються замість повернення каретки, тому що я налаштував свій улюблений текстовий редактор Windows для використання закінчень рядків у стилі UNIX замість Windows.
Містер Фооз

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.