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