Emacs: Как создать новый "пустой" буфер при создании нового фрейма?
Мой Emacs находится в системе OS X. Есть ли способ сделать новый фрейм по умолчанию для пустого буфера всякий раз, когда я использую ⌘N (точно так же, как работает TextEdit)? Я предпочитаю сначала писать содержимое и позже определять подходящее имя файла. Тем не менее, Emacs хочет, чтобы я сначала определил имя файла и написал содержимое позже. Я не вижу в этом никакого преимущества. Кто-нибудь знает, почему Emacs работает именно так?
В принципе, если я использую C-x 5 2, Emacs всегда всплывает кадр с любым файлом, в котором я сейчас работаю. Это неудобно. Я также не хочу, чтобы мой Emacs всплывал по новому фрейму, по умолчанию на *scratch*
(многие результаты поиска Google каким-то образом предлагают такой подход). Я предпочитаю иметь буфер, временно называемый "Без названия" в новом фрейме, и если я снова использую ⌘N, Emacs выведет еще один временный буфер "Без названия 2" и так далее. Таким образом, я могу позже определить имена файлов в буфере.
Ответы
Ответ 1
Вы можете создавать новые буферы с помощью switch-to-buffer
. Введите Cx b
, введите имя буфера и нажмите RET
. Если буфер с таким именем не существует, Emacs автоматически создает новый файл в основном режиме. Вы можете переключиться на любой другой режим, как обычно, с помощью Mx
, например Mx python-mode
. Чтобы изменить буфер по умолчанию, установите значение по умолчанию для major-mode
в нужный буфер.
Если вы хотите, чтобы имя буфера выбрано автоматически и создайте новый фрейм, вы должны написать свою собственную команду:
(defun lunaryorn-new-buffer-frame ()
"Create a new frame with a new empty buffer."
(interactive)
(let ((buffer (generate-new-buffer "untitled")))
(set-buffer-major-mode buffer)
(display-buffer buffer '(display-buffer-pop-up-frame . nil))))
Свяжите это с Cc n
:
(global-set-key (kbd "C-c n") #'lunaryorn-new-buffer-frame)
Теперь нажатие Cc n
создает новый кадр с новым пустым буфером с именем "untitled", где x является последовательным числом.
Ответ 2
Это может сработать для вас, если я понимаю ваш запрос:
(defun empty-frame ()
(interactive)
(let ((fl (make-temp-file "Untitled")))
(switch-to-buffer-other-frame fl)))
Это откроет новый временный файл для каждого нового буфера. Если вы предпочитаете не создавать файл, вы можете использовать его вместо этого:
(defun empty-frame ()
(interactive)
(let ((bn "Untitled-")
(num 1))
(while
(get-buffer (concat bn (number-to-string num)))
(setq num (1+ num)))
(switch-to-buffer-other-frame
(concat bn (number-to-string num)))))
Ответ 3
Ниже будет создан буфер с уникальным именем. Буфер не связан с каким-либо файлом, поэтому если/когда вы когда-либо используете Cx Cs
save-buffer
, вам будет предложено указать имя файла.
(defun empty-frame ()
"Open a new frame with a buffer named Untitled<N>.
The buffer is not associated with a file."
(interactive)
(switch-to-buffer-other-frame (generate-new-buffer "Untitled")))
Ответ 4
Вы видели ответы о том, как создавать новые буферы "Без названия", но что касается того, почему Emacs хочет, чтобы вы сначала выбрали имя, некоторые из причин:
- Исторический: это то, как он работал, и как только вы привыкнете к нему, это не хуже альтернативы.
- Основные режимы и различные другие детали обычно выбираются на основе имени файла. Поэтому вместо создания буфера Untitled и необходимости выбирать, следует ли его перевести в режим LaTeX или режим C, вы просто открываете файл с расширением ".tex" или ".c".
- Наличие имени файла означает, что Emacs может использовать стандартную процедуру автоматического сохранения, тогда как при использовании подхода Untitled приложения должны иметь специальный способ автоматического сохранения этих документов Untitled в каком-то "стандартном" месте.
Ответ 5
Cx b * untitled * откроет новый буфер, если не существует. Также см. Руководство Emacs