LINUX.ORG.RU

Emacs indentation

 ,


0

1

Прошу помощи в настройке форматирования в Emacs. Сейчас сделано так:

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq-default tab-stop-list (number-sequence 4 200 4))

Не устраивает, что для того чтобы вставить табуляцию в режиме правки кода надо нажимать C+Q+TAB. При этом вставляется именно TAB, а не 4 пробела.

Нужно чтобы:

  • при нажатии TAB втыкалось 4 пробела вне зависимости от режима
  • при нажатии, например, SHIFT+CTRL+F происходило auto-indentation, т.е. то что сейчас происходит при нажатии TAB.

Доки курил, не помогает.


режиме правки кода

Это какой именно? Ты что-то делаешь не так. За отступы для различных ЯП отвечают обычно их режимы - их и нужно ковырять. Как вариант реализовать в конфиге необходимые тебе функции и перебиндить клавиши, хотя первый метод менее костылен.

Lilly
()

При этом вставляется именно TAB, а не 4 пробела.

Тебе сказать, как сделать, чтобы Emacs вставлял пробелы вместо табов, или сам нагуглишь?

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от theNamelessOne

Тебе сказать, как сделать, чтобы Emacs вставлял пробелы вместо табов

Мне надо сказать, как сделать чтобы он вставлял пробелы вместо табов при нажатии TAB для _всех_ ЯП, а не выполнял авто-индентацию. Ее надо забиндить на другую комбинацию. Как в любой IDE.

Хотя, судя потому через какую задницу работает банальное смещение блока текста влево, я не надеюсь что это возможно.

emcode
() автор топика

У меня примерно так:

(defun indent-params ()
    (setq-default c-default-style "bsd" c-basic-offset 4))

(add-hook 'c-mode-hook 'indent-params)

(setq-default indent-tabs-mode nil)
(setq-default tab-width 4)
(setq indent-line-function 'insert-tab)

(require 'autopair)

(defun setup-indent ()
  (autopair-mode t)
  (local-set-key (kbd "RET") 'newline-and-indent))

(add-hook 'c-mode-common-hook 'setup-indent)

Используется autopair. Наверное, можно и проще, я не разбирался.

gv
()
Ответ на: комментарий от gv

Спасибо, но штука в том, что я хочу изменить дефолтное поведение, потому что редактировать надо исходники на нескольких языках.

emcode
() автор топика
Ответ на: комментарий от emcode

Спасибо, но штука в том, что я хочу изменить дефолтное поведение, потому что редактировать надо исходники на нескольких языках.

В голову приходят такие варианты:

  • Вешать хук на все нужные режимы (я бы сделал так).
  • Вешать хук на find-file-hook.
  • Писать свой глобальный минорный режим и вешать хук в него.

А в этом хуке настраивать indent-tabs-mode, indent-line-function, etc.

gv
()
Ответ на: комментарий от emcode

Да, еще можно попробовать в глобальном минорном режиме перебиндить TAB. Или в каждом нужном режиме.

gv
()

ё-моё ну так забиндь на кнопку таб (insert-string " ") а на кнопки S-C-F (indent-line)

(global-set-key [tab] #'(lambda () (insert "    ")))
(global-set-key (kbd "C-S-F") #'indent-according-to-mode)

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Bad_ptr

Да. Почти то что надо!

(defun indent-region (N)
  (interactive "p")
  (if (use-region-p)
      (progn (indent-rigidly (region-beginning) (region-end) (* N 4))
             (setq deactivate-mark nil))
    (self-insert-command N)))
Подскажите, пожалуйста, как пофикстить эту функцию, чтобы, когда выделен регион, она делала, то что и делает. А когда регион не выделен, делала вот это самое:
(insert "    ")

emcode
() автор топика
Ответ на: комментарий от emcode

Пришлось подучить elisp. Победил. Финальный вариант.

(setq tab-width 4)

(defun indent ()
  (interactive)
  (if (use-region-p)
      (progn
        (indent-rigidly (region-beginning) (region-end) tab-width)
        (setq deactivate-mark nil)
      )
      (progn
        (insert (apply 'concat (make-list tab-width " ")))
      )
  )
)

(defun unindent ()
  (interactive)
  (if (use-region-p)
      (progn (indent-rigidly (region-beginning) (region-end) (- tab-width))
             (setq deactivate-mark nil))
  )
)

(global-set-key [tab] 'indent)
(global-set-key ">" 'indent)
(global-set-key "<" 'unindent)
Всем спасибо.

emcode
() автор топика
Ответ на: комментарий от emcode

Ну, если уж тебе это не осилить... то зачем тебе емакс)

(global-set-key [tab] #'(lambda () (if (use-region-p)
                                      (indent-region)
                                     (insert "    "))))
Да, в лямбде тоже надо (interactive) первой командой, вроде.

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от emcode

(global-set-key (kbd «C-S-F») #'indent-according-to-mode)

+ правильный ответ на второй вопрос.

(global-set-key (kbd "C-S-f") 'indent-for-tab-command)

emcode
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.