LINUX.ORG.RU

Как в Emacs задать кодировку для файлов внутри директории?

 


0

1

Собственно, сабж. Имеется несколько проектов с разной кодировкой файлов и хочется иметь возможность задавать кодировку по умолчанию для каждого проекта автоматически. Если в .dir-locals.el написать что-то вроде:

((nil . ((coding . utf-8))
))
То при открытии файлов из этой директории будет такое сообщение:

Warning (files): Coding cannot be specified by dir-locals

Может можно всё-таки как-то задавать кодировку для проекта в .dir-locals.el? Или каким-то похожим образом?


 ;;; Emacs 23 is unable to open this file properly:  -*- coding: windows-1252 -*-

ЗЫ зачем это нужно если есть юникод?

ados ★★★★★
()

Можно в каждый файл записать его кодировку через переменную -*- coding: koi8-r -*- экранированную соответствующим знаком комментария.

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

Это способ знаю, не подходит. Хотелось бы сделать это единоразово для всех файлов проекта в выбранной директории. И чтобы при открытии/создании файла в проекте кодировка автоматически устанавливалась. Неужто никак нельзя этого сделать?

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

Я это уже осознал. Потестировал локально немного с .dir-locals.el как это написано в документации. Вроде бы с koi8-r вполне себе работает (локаль utf8), а с cp1251 нет — в общем чего-то я не понимаю. Никаких сообщений, что что-то не так не обнаружил.

Emacs 24.3.1

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

В документации никаких ограничений не обнаружил: https://www.gnu.org/software/emacs/manual/html_node/emacs/Directory-Variables...

Так же можно указывать поведение для конкретных директорий прямо в .emacs

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

Вот такой вариант .dir-locals.el тоже не работает:

((nil . ((buffer-file-coding-system . 'windows-1251)
         (coding-system-for-read . 'windows-1251))
))

Открываю файл в кодировке windows-1251 — открываются кракозябры. При этом ругается как-то так (но это ладно):

The local variables list in <...> contains values that may not be safe

Фигня какая-то. У меня spacemacs на Emacs 24.5.

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

Ну, допустим я напишу функцию, которая в зависимости от пути файла будет ставить для буфера кодировку. Но при этом оно будет находиться где-нибудь в ~/.emacs, например. А хочется, чтобы конфигурация кодировки задавалась файлом проекта (как .dir-locals.el).

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

напиши функцию, которая будет подниматься вверх по пути файла и искать там файл .dir-locals.el, считывать его содержимое read'ом и assoc'ом по получившемуся списку брать значение кодировки.

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

Похоже, что предложенный тобой способ единственный, который может сработать, помимо явного указания кодировки через -*- coding: ... -*-. Только когда будет вызываться хук? Когда файл уже загружен в буфер с неправильной кодировкой? Если так, то придётся перезагружать буфер заново с нужной кодировкой. Прям такой конкретный костыльчик.

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

В общем, я придумал такой костыль (в .dir-locals.el):

(
 (nil .
   (
     (eval modify-coding-system-alist 'file "projname/\(dir1|dir2\)/.+" 'utf-8)
   )
 )
)
Только существенный минус в том, что оно будет вызываться каждый раз при открытии файла. Так что можно положить всё это дело в ~/.emacs.

Ещё один способ — перекодировать буфер в find-file-hook. Только в таком случае буфер будет изменяться, что не есть хорошо.

Как-то всё печально.

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