Подтвердить что ты не робот

Emacs: задайте вкладку вкладки только для одного файла на лету

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

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

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

(setq-default tab-width int)

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

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

// Local Variables:
// js-indent-level: 2
// indent-tabs-mode: nil
// End:

Ответ 4

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

Если вы хотите, чтобы переменные применимы ко всем файлам в данном каталоге, то, по-видимому, это путь к локальным переменным каталога, и вы можете реализовать это с помощью файла .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)

Ответ 5

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

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

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

Ответ 6

Я использую фрагмент кода в моем 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))))