Emacs: установить отступ для вкладки только для одного файла на лету - PullRequest
25 голосов
/ 05 июня 2011

Я работаю над проектом с открытым исходным кодом, где создатель устанавливает свои отступы табуляции в 2 пробела.

Я бы хотел включить его на лету для одного файла, над которым я работаю, а не для других файлов того же типа.Должно быть что-то вроде Mx set-tab-indent.Это файл JavaScript, оканчивающийся на .js.

. Я знаю, что могу использовать:

(setq-default tab-width int)

внутри моего .emacs файла, но я просто вызываю Mx command, чтобы установить его и забыть во время моей работы над этим файлом.Я попытался Mx apropos и Google, но не смог найти конкретную команду.

Спасибо.

Ответы [ 6 ]

25 голосов
/ 05 июня 2011

Вы можете сделать переменную js-indent-level локальной для буфера, используя:

M-x make-variable-buffer-local <RET> js-indent-level <RET>

Затем вы можете установить эту переменную в буфере, используя:

M-x set-variable <RET> js-indent-level <RET> 2

13 голосов
/ 05 июня 2011

Вы также можете использовать локальные переменные файла для автоматизации решения omrib для этого одного файла, добавив к нему следующее:

// Local Variables:
// js-indent-level: 2
// indent-tabs-mode: nil
// End:
7 голосов
/ 30 сентября 2017

Самый простой способ сделать это для одиночного буфера - это использовать M-x set-variable.

  1. Введите M-x set-variable и нажмите ввод
  2. Когда будет предложено установить переменную, установите tab-width, затем нажмите enter
  3. Вам будет предложено ввести строку Set tab-width (buffer-local) to value:. Введите желаемое значение и нажмите ввод

Буфер должен быть немедленно обновлен новым значением.

6 голосов
/ 05 июня 2011

Создайте файл ".dir-locals.el" в каталоге проекта и заполните его следующим образом:

((nil . ((tab-width . 2))))

Это обеспечит автоматическую настройку ширины табуляции, и вам не нужно изменять фактический файл (который, вероятно, зависит от версии.)

См. руководство для получения дополнительной информации о формате. Я считаю, что для этого требуется Emacs 23.

1 голос
/ 08 июня 2011

Как отмечают другие, одна проблема с подходом к локальным переменным файла заключается в том, что вам нужно изменить файл, и это не идеально, если вам нужно сохранить эти объявления вне контроля версий.

Если вы хотите, чтобы переменные применялись к всем файлам в указанном каталоге, тогда локальные переменные каталога, очевидно, являются подходящим способом, и вы можете реализовать это либо с помощью файла .dir-locals.el, либо с помощьюзвонить (dir-locals-set-directory-class):

Я сам предпочитаю подход с использованием каталога, и я подумал, что этоЖаль, что нет аналогичного подхода к локальным переменным файла, но я обнаружил, что код класса каталога на самом деле отлично работает с файлами, и единственная проблема заключается в том, что dir-locals-set-directory-class вызывает file-name-as-directory в своем аргументе, что препятствует егоиз-за обратной косой черты.

Таким образом, ниже приведен способ настройки локальных переменных каталога для одного файла без изменения самого файла.или влияет на другие файлы в том же родительском каталоге.

(defun my-file-locals-set-directory-class (file class &optional mtime)
  "Enable 'directory local' classes for individual files,
by allowing non-directories in `dir-locals-directory-cache'.
Adapted from `dir-locals-set-directory-class'."
  (setq file (expand-file-name file))
  (unless (assq class dir-locals-class-alist)
    (error "No such class `%s'" (symbol-name class)))
  (push (list file class mtime) dir-locals-directory-cache))

(dir-locals-set-class-variables
 'my-javascript-class
 '((nil . ((js-indent-level . 2)
           (indent-tabs-mode . nil)))))

(my-file-locals-set-directory-class
 "path/to/the/file.js" 'my-javascript-class)
0 голосов
/ 08 марта 2017

Я использую фрагмент кода в моем init.el, который пытается автоматически определять файлы, использующие отступы в 2 пробела, и переключать отступ Emacs для этого файла на 2 пробела, когда он видит такие файлы:

(add-hook 'js-mode-hook
          (lambda ()
            (when (string-match-p "^  [A-Za-z]" (buffer-string))
              (make-variable-buffer-local 'js-indent-level)
              (set-variable 'js-indent-level 2))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...