GNU Emacs 24.1: принуждение клавиши TAB к вставке символа ‹tab› в режиме ESS

Я почти никогда не использую клавишу TAB для чего-либо, кроме вставки символа <tab> (\t). Недопустимо продолжать набирать C-q TAB для этого, потому что я в основном использую вкладки для комментариев. Большая часть отступов в моем коде выполняется Emacs, автоматически сопоставляя мою первую строку с ручным отступом, и путем привязки indent-region к C-TAB. Я в основном использую клавишу табуляции для отступа в комментариях. Я предпочитаю устанавливать ширину табуляции на 8 символов и делать отступ для каждого комментария двумя символами табуляции, в общей сложности 16 символов пробела. Я был бы в порядке с существующей системой управления отступами, если бы ESS не был склонен к сбоям, как описано здесь. В файле, над которым я сейчас работаю, есть прерывистые линии, которые вызывают именно описанную проблему. В настоящее время в этом файле нажатие клавиши tab НЕ дает результата.

Как заставить клавишу табуляции вставить символ табуляции в режимах ESS [S] и ESS [SAS]?

Я пробовал добавить

(global-set-key "\C-i" 'self-insert-command)

и

(setq-default tab-always-indent nil)

в мой .emacs файл, но это не повлияло на поведение ESS. Я не могу понять, что Emacs вызывает внутри себя режим ESS [S], т.е.

(define-key ess-mode-map "\C-i" 'self-insert-command)

выдает ошибку

"Переменная ess-mode-map недействительна".

Я пробовал ess-S-mode, ess-s-mode, ESS-S-mode и еще несколько с тем же результатом.

Я также подтвердил, что ess-mode-hook и ess-mode-map являются ожидаемыми переменными ловушки и карты. Я тогда попробовал

(add-hook 'ess-mode-hook (lambda () (define-key "\t" ess-mode-map 'self-insert-command)))

что не сработало.

Я попытался отредактировать файл ess-mode.el и изменить раскладку клавиш с «\ t» на 'self-insert-command, что не дало никакого эффекта.


person user2127595    schedule 19.05.2014    source источник
comment
comment
Должен быть закрыт как дубликат stackoverflow.com/q/18970809/729907.   -  person Drew    schedule 20.05.2014
comment
Я спорю, проблема не в том, что Emacs вставляет пробелы вместо табуляции, а в том, что EMACS НИКОГДА не вставляет символ ‹tab› (\ t) при нажатии TAB в режиме ESS. Я хочу изменить это значение по умолчанию.   -  person user2127595    schedule 20.05.2014
comment
Ох, хорошо. В этом случае просто привяжите "\t" к self-insert-command на карте режимов.   -  person Drew    schedule 20.05.2014
comment
Я пытался сделать именно это, но не могу понять, что называется ess-mode. (global-set-key "\t" 'self-insert-command) не работает и (define-key ess-mode-map "\t" 'self-insert-command) выходит из строя с ошибкой: значение символа как переменной недействительно: ess-mode-map   -  person user2127595    schedule 20.05.2014


Ответы (4)


Практическое решение было простым, просто добавьте:

(add-hook 'ess-mode-hook (lambda () (local-set-key "\t" 'self-insert-command)))

в .emacs файл.

person user2127595    schedule 21.05.2014

Похоже, что переменная карты не определена до загрузки кода, определяющего режим, или, возможно, даже до того, как режим будет включен.

  • Если первый, то require библиотека перед попыткой привязать ключ. Или используйте eval-after-load.

  • Если второй, то на крючок режима ставим привязку:

    (add-hook 'THE-MODE-HOOK (lambda () (define-key "\t" THE-MODE-MAP 'self-insert-command)))
    

Возможно, вам придется заглянуть в исходный код, чтобы узнать, что такое THE-MODE-HOOK и THE-MODE-MAP. Или вы можете получить то, что вам нужно, от C-h f THE-MODE, где THE-MODE - имя режима.

person Drew    schedule 19.05.2014
comment
Я не знаю, как называется библиотека. это не ess-библиотека. ess, похоже, тоже не относится к режиму. - person user2127595; 20.05.2014
comment
Я бы сказал, либо дождитесь ответа от кого-то, кто использует ESS здесь, либо посмотрите руководство ESS ... Или, если у вас есть исходный код, по-видимому, вы можете его найти (например, grep для define-key, global-set-key, map и скоро). Если нет, надеюсь, у кого-то есть для вас полный ответ. - person Drew; 20.05.2014
comment
Я медленно прорабатываю руководство по ess-mode и некоторые из его файлов .el, спасибо за хорошие предложения. - person user2127595; 20.05.2014
comment
Похоже, что переменная карты ess-mode-map, определена в ess-mode.el. - person legoscia; 20.05.2014

M-i привязан к tab-to-tab-stop в Emacs, который постоянно добавляет 8 пробелов, но я уверен, что это можно настроить. Есть еще несколько команд, которые могут вам помочь: Команды отступа.

person nymo    schedule 20.05.2014

Я не совсем понимаю вашу проблему, но это два альтернативных варианта:

  1. Повторно привязать ключ локально:

    (define-key ess-mode-map "\C-i" 'self-insert-command)
    
  2. Измените поведение вкладки ess, которая заставит TAB отступать только в начале строки, иначе всегда будет вставляться простой tab:

    (setq ess-tab-always-indent nil)
    
person VitoshKa    schedule 19.05.2014
comment
В моем вопросе вы заметите, что я попробовал ваше первое предложение, и оно привело к ошибке, потому что ess не относится к режиму ESS. - person user2127595; 20.05.2014
comment
Затем узнайте, что такое текущая раскладка клавиатуры, и привяжите ее к ней. - person Drew; 20.05.2014
comment
@ user2127595, сначала загрузите ESS, затем привяжите ключ, или используйте ess-mode-hook, как предложил Дрю. - person VitoshKa; 21.05.2014
comment
Хм, M-x local-set-key C-m TAB self-insert-command сработало. Но перехватчик режима, указанный в моем вопросе, не работал. Как мне сказать emacs привязать этот ключ при загрузке ESS? - person user2127595; 21.05.2014
comment
вау, я дурак ..._ 1_ отлично сработало. Спасибо! - person user2127595; 21.05.2014