Emacs: задайте вкладку вкладки только для одного файла на лету
Я работаю над проектом с открытым исходным кодом, где создатель устанавливает свои вкладки в два пробела.
Я хотел бы просто включить его на лету для одного файла, над которым я работаю, а не других файлов того же типа. Должно быть что-то вроде M-x set-tab-indent
. Это файл JavaScript, заканчивающийся на .js
.
Я знаю, что могу использовать:
(setq-default tab-width int)
внутри моего файла .emacs
, но я скорее просто позвоню M-x command
, чтобы установить его и забыть во время моей работы над этим файлом. Я пробовал M-x apropos
и Google, но не смог найти определенную команду.
Спасибо.
Ответы
Ответ 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))))