Q: как я могу получить новые буферы для соответствия отображению auto-mode-alist
?
При поиске файла Emacs сравнивает расширение файла с тем, auto-mode-alist
чтобы определить, какой основной режим использовать для буфера файла. Есть ли способ использовать информацию auto-mode-alist
для определения режима для буфера, с которым (пока) не связан файл?
То есть: если я открою новый буфер , имя которого имеет нечто, похожее на расширение файла, могу ли я заставить его автоматически открываться в ожидаемом режиме? Например, если бы я должен был открыть новый буфер, a-new-buffer.el
который еще не связан с файлом, я хочу, чтобы он открывался, emacs-lisp-mode
а не в режиме по умолчанию.
auto-mode-alist
, вы заставляете буфер « посещать » файл (и это обо всем позаботится).org
буфер для тестирования новых функций, в которых я пишу для использованияorg-mode
; б) временныйR
буфер для быстрых статистических манипуляций; в) временный текстовый буфер для создания электронного письма. В каждом случае я не хочу создавать файл для посещения, я просто хочу одноразовый буфер, который, тем не менее, открывается в соответствующем режиме.C-x C-f
бы не « создать файл для посещения ». Это фундаментальное недоразумение. Они просто делают именно то, что вы ищете. Это только если и когда вы пытаетесь сохранить буфер , что файл будет создан. Если вы не попытаетесь сохранить буфер, файл не будет создан. Насколько я понимаю, вы хотите «посетить файл» (что в действительности означает открыть буфер в правильном режиме).Ответы:
Команды посещения файла, такие как
C-x C-f
не создавать файл для посещения. Они делают то, что вы ищете.Только если и когда вы попытаетесь сохранить буфер , файл будет создан .
Если вы не попытаетесь сохранить буфер, файл не будет создан. Насколько я понимаю, вы хотите « посетить файл » (что в действительности означает открыть буфер в правильном режиме).
источник
n
чтобы не сохранить, либо (часто) просто сохраняю буфер. А потом я кидаю созданный файл ... или нет.)*scratch*
: вам предлагается сохранить, когда этот палец автоматически ударитсяC-x C-s
.Если бы использовали решение Юрия Линкова в течение многих лет.
Я создаю временные буферы с чем-то вроде
C-x
b
test.org
C-j
.major-mode
Определяется расширением файла черезauto-mode-alist
.Чтобы проверить эффект вы можете попробовать
(prog1 (and (switch-to-buffer "my-new.org") major-mode) (kill-buffer "my-new.org"))
=>
org-mode
. В чистом видеemacs -q
тест вернетсяfundamental-mode
.источник
advice
вариант, который я использовал. Не уверен, что я понимаю, для чего эта(prog1...)
часть, но(setq-default major-mode ...)
она довольно приятная.prog1
просто показывает, что вы получаете ожидаемоеmajor-mode
при переключении в буфер. Оценитеsetq-default
деталь и запустите тест. Он вернетсяorg-mode
без того,setq-default
что он вернетсяfundamental-mode
.Придумал способ, основанный на советах, используя идеи, которые исходили из комментариев @ Drew и ответа @ glucas, которые я запишу здесь на случай, если они пригодятся кому-либо.
Краткая версия: используйте
after
рекомендацию, чтобы узнать, имеет ли буфер имя файла, временно установите его, если его нет, а затем позвольте остальной частиset-auto-mode
оборудования позаботиться о деталях. После небольшого тестирования (не обширного), кажется, работает нормально.Для
ido-switch-buffer
и ванилиswitch-to-buffer
два совета будут:Я нахожу этот вариант полезным в дополнение к тому,
find-file
что поднял @Drew, потому что мои пальцы могут опередить мой мозг: мышечная память часто выводит меня на территорию переключения на буфер до того, как я полностью осознаю, чтоfind-file
буду делать то, что мне нужно. Теперь оба варианта доступны.ОБНОВЛЕНИЕ: небольшая, но потенциально раздражающая ошибка в приведенном выше коде: он будет повторно запускать ловушку режима для буфера каждый раз, когда вы переключаетесь на него. Следующее дает ему фактическое имя файла вне
/tmp
каталога и позволяет избежать этой проблемы:источник
set-auto-mode
Функция устанавливает режим , основанный на файл , связанный с буфером. Вот функция, которая временно устанавливаетсяbuffer-file-name
из имени буфера для установки режима:Вы можете запустить это, когда буфер переименован, используя advice:
Я не уверен в том, какое место лучше всего использовать для создания новых буферов. Здесь я использую
buffer-list-update-hook
, но это вызывается в большем количестве случаев, чем нам нужно.источник
buffer-list-update-hook
потому чтоchange-major-mode-hook
не вызывался с ожидаемым текущим буфером. Для записи, вероятно, имеет смысл посоветовать вашу функцию переключателя буфера, как @Dan в своем ответе.Вы можете использовать буферы * scratch * для создания временных буферов, которые имеют тот же основной режим, что и файл, с которым вы можете работать.
Вот ответ Emacs SE, который может решить вашу проблему:
Как я могу быстро переключаться между файлом и буфером * scratch * с одинаковым основным режимом?
Упомянутый вопрос и ответ были опубликованы мной. Ответ в функции делает следующее:
*scratch-X-mode*
который вызывается, если он еще не существует, и переключается на этот вновь созданный буфер.*scratch-X-mode*
уже существует, он просто переключается на этот буфер.источник
Здесь есть несколько хороших ответов, но я хотел бы добавить еще одну вещь. Emacs имеет множество функций, и часто есть несколько способов что-то сделать. Вы можете добавить теги вверху любого файла, которые сообщают emacs, какой тип он имеет, независимо от расширения. Например, добавив это:
В верхней части файла emacs узнает, что это файл Python, даже без
.py
расширения. Обратите внимание, что#
в начале строки находится комментарий в стиле Python. Для разных типов файлов вы можете использовать разные комментарии. Например, чтобы указать файл Lisp, который вы используете;
для запуска строки комментария и установить режим в emacs, например:См. Определение файловых переменных и Выбор режимов файла .
источник
switch-buffer
) и о том, чтобы режим автоматически устанавливался на что-то отличное отfundamental-mode
.