Улучшенная вкладка в Emacs

Я хочу переопределить плохую схему табуляции по умолчанию в emacs, чтобы она работала как большинство других редакторов (eclipse, notepad ++). Я хочу настроить его так, чтобы независимо от режима вкладка вставляла вкладку, а нажатие клавиши ввода сохраняло мою текущую глубину вкладки.

Я пробовал это, но ничего не дает:

(global-set-key (kbd "TAB") 'tab-to-tab-stop)
(setq default-tab-width 4) ;; 8 is way too many

Некоторые основные режимы могут отменять это. Не могли бы вы рассказать больше об окружающей среде?

dmckee --- ex-moderator kitten 05.12.2008 23:13

Я действительно стремлюсь получить его для всех сред. Меня действительно раздражает, когда он решает, что знает лучше меня, и отказывается позволить мне делать отступы, как мне заблагорассудится. например. в конфигурации apache это позволяет мне вкладка 1, 8 символов и не более того. режим elisp нормален, но несовместим с обычным.

AlexH 06.12.2008 03:12

Если он допускает только одну 8-символьную вкладку, исправление состоит в том, чтобы изменить который, изменить то, что является его позициями табуляции. (Или измените функцию отступа.)

ShreevatsaR 06.12.2008 22:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
5 001
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

C-j выполняет функцию перехода на новую строку + отступ, которую вы хотите отключить при нажатии Enter.

Ответ принят как подходящий

Чтобы клавиша Enter переводила вас на следующую строку и автоматически делала отступ, вы можете поставить

(global-set-key (kbd "RET") 'newline-and-indent)

в вашем .emacs. [Или вы можете нажать C-j вместо Enter.] Как только вы это сделаете, вам никогда не придется вставлять табуляции вручную, потому что Emacs автоматически увеличивает отступ новой строки до дополнительной глубины после открывающей скобки и т. д. отступ, вы можете нажимать TAB, пока он не переместит вас к нужному отступу, а затем начните вводить оттуда. [И когда вы вводите закрывающую скобку, Emacs достаточно умен, чтобы переместить эту скобку на один уровень отступа назад.]

Вы должны удалить (global-set-key (kbd "TAB") 'tab-to-tab-stop), чтобы это работало.

Многие основные режимы отменяют связывание TAB, например, cc-режим связывает TAB с 'c-indent-to-column.

Предлагаемый 'global-set-key ничего не делает, поскольку почти каждый основной режим переопределяет TAB.

Один из приемов, который может сработать для вас, - скопировать подход, который использует 'pabbrev, и определить глобальный второстепенный режим, связанный с TAB. Сделать это можно так:

(defvar just-tab-keymap (make-sparse-keymap) "Keymap for just-tab-mode")
(define-minor-mode just-tab-mode
  "Just want the TAB key to be a TAB"
  :global t :lighter " TAB" :init-value 0 :keymap just-tab-keymap
  (define-key just-tab-keymap (kbd "TAB") 'indent-for-tab-command))

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

На самом деле очень немногие основные режимы повторно связывают TAB, и еще меньше должны это делать. Вместо этого им следует полагаться на indent-line-function.

Stefan 29.11.2018 18:16

Меня это тоже беспокоило, когда я только начал использовать Emacs. Хотя я полюбил это. Если я хочу сделать соответствующий отступ, я нажимаю <tab>;, если я хочу вставить буквальную табуляцию, я нажимаю M-i (Meta и 'i' или <Alt> - <i> на некоторых языках), который привязан к tab-to-tab-stop.

Я думаю, что ответ Трея Джексона, вероятно, то, что вы хотите, за исключением, возможно, использования 'self-insert-command вместо 'indent-for-tab-command. Лично я предпочитаю поведение emacs по умолчанию, но self-insert-command делает то, что он говорит, вместо того, чтобы пытаться делать что-нибудь необычное, например, проверять, правильно ли отформатирован ваш код.

Несколько раз я на самом деле хочу, чтобы вставить табуляцию (а не отступ), я нажимаю M-i.

M-i !!!! Сэр, вы лично спасли меня от запястного канала ... Control-q <TAB> начал сказываться на моей левой руке.
Jis Ben 16.06.2012 05:08
M-i - это tab-to-tab-stop, который вставляет символ табуляции только в том случае, если значение indent-tabs-mode истинно. Однако вам может показаться, что C-q C-i легче набирать, чем C-q TAB (особенно, если у вас есть клавиша Caps Lock, настроенная как клавиша Ctrl).
phils 16.06.2012 09:37

Возможно, вас заинтересует этот второстепенный режим, который я создал на http://github.com/vohrta/regtab.

Это делает так, что, когда вы нажимаете клавишу табуляции, либо символ табуляции (если indent-tabs-mod не равен nil), либо пробелы ширины табуляции будут помещены в точку. Этот режим также может обрабатывать то, что вы можете считать обычным поведением в области выделенного текста, и использовать сдвиг с табуляцией для удаления табуляции в начале строки (или набора строк).

Вы можете включить или отключить его в любое время, нажав M-x regtab-mode.

Другие вопросы по теме