如何在emacs中创建一个新的、未命名的文件?

5

这是一个非常简单的要求:我想创建一个新的空白文件,但不给它命名(至少还没有)。我可以使用“scratch”缓冲区,但只有一个。我可以使用C-x C-f来打开一个新文件,但是那样我就必须给它一个名称和路径。如果我只是写一些笔记或勾画一些想法,我不想给它命名。如何创建一个新的、空的、未命名的文件?


1
缓冲区不一定是存在于硬盘上的文件,但是缓冲区必须有一个名称,即使是“未命名”也可以被视为名称。 - lawlist
5个回答

13

您可以使用以下方法创建新缓冲区:C-xb,然后输入缓冲区名称,它将根据您选择的名称创建一个新缓冲区。

如果您想保存该缓冲区,只需按下C-xw,将文件及其内容保存到所需位置。

我的建议是让您尝试一下org-mode,它除了其他数百万个功能外,也可以完成您需要的功能。


8
给它一个名称,但不要保存它。这是Emacs的方式。使用“C-x C-f”命令,给(即将访问文件的)缓冲区命名。编辑文本。不要使用“C-x C-s”命令将缓冲区保存到文件中(即磁盘)。请注意,您可以先进入一个您不关心其内容的目录,以便如果您意外地将缓冲区保存在那里,则可以轻松找到、识别和删除该文件。要更改目录,请使用“M-x cd”命令。或者,在首次使用“C-x C-f”命令时,通过编辑目录部分来完成。或者使用“C-x d”命令将自己放入Dired缓冲区中,以便查看目录内容。
如果您不想冒意外敲击“C-x C-s”命令而保存编辑结果的风险,则可以使用“C-x b”命令代替“C-x C-f”命令。这样,系统会提示您输入缓冲区名称。如果您提供一个新的名称(而不是现有缓冲区的名称),则会创建一个新的缓冲区。在这种情况下,如果您使用“C-x C-s”命令,Emacs会提示您输入要保存缓冲区的文件位置。
为什么要使用“C-x C-f”命令而不是“C-x b”命令呢?因为在您给出文件名时,如果提供了文件扩展名,则Emacs会自动将缓冲区置于正确的主模式下(通常情况下)。否则(对于“C-x b”命令),您需要将缓冲区放入所需的模式中。
默认情况下,“* scratch *”缓冲区处于Lisp-Interaction模式下,这与Emacs-Lisp模式类似(但并不完全相同)。

3
在其他文本编辑器或文字处理器中,通常会创建一个“新文件”或“新缓冲区”,而不是切换到特殊的*scratch*缓冲区。例如,您可以在几个不同的缓冲区中编写快速笔记或想法,以跟踪它们 - 稍后再决定是否将它们丢弃或保存。或者您可能需要操作一小段文本或代码,但不想更改原始缓冲区,因此只需将其复制并粘贴到新的临时缓冲区即可。 *scratch*被设置为Lisp交互模式,但如果我想快速评估一些Elisp代码,我可以使用eval-expressionAlt+:)或在Elisp解释器IELM中运行它(Alt+x Enter ielm)。此外,如果您关闭*scratch*缓冲区,则不会要求您保存它,因此您可能会意外丢失所有工作。 Drew's traditional solution看起来不太优秀。我也不认同“这就是在Emacs中的做法”的论点。 Emacs是可自定义的编辑器,因此您可以创建适合自己舒适的任何工作流程。
这就是ErgoEmacs解决它的方式,通过创建一个new-empty-buffer命令。您可以像这样实现它:
(defun new-empty-buffer ()
  "Opens a new empty buffer."
  (interactive)
  (switch-to-buffer (generate-new-buffer "untitled"))
  (funcall initial-major-mode)
  (put 'buffer-offer-save 'permanent-local t)
  (setq buffer-offer-save t))

变量buffer-offer-save在每次更改主模式时都会重置,因此您需要使用permanent-local进行注释。它仅在您退出Emacs时提示。我认为,在关闭已修改的untitled缓冲区之前,它也会询问,因此请参见我的解决方案,了解如何升级kill-buffer以在关闭已修改的缓冲区之前提示。
ErgoEmacs彻底改变了默认的按键绑定,并将new-empty-buffer绑定到Ctrl+N,就像几乎所有软件一样。如果您想要新缓冲区在启动时具有另一个模式,请更改变量initial-major-mode
另请参见:

1

一个缓冲区和一个文件并不是同一件事情。

术语

关于缓冲区,

在Emacs中,您正在编辑的文本驻留在一个称为缓冲区的对象中。每次访问一个文件时,都会使用一个缓冲区来保存文件的文本。

关于文件,

操作系统将数据永久地存储在命名文件中,因此您使用Emacs编辑的大多数文本都来自文件,并最终存储在文件中。

通过访问,缓冲区和文件相关联,

访问一个文件意味着将其内容读入Emacs缓冲区,以便您可以编辑它们。 Emacs为您访问的每个文件创建一个新的缓冲区。

回答问题

除非我弄错了,从技术上讲,按照您的问题所写,它是无法回答的。严谨地说,未命名文件不存在(或者几乎没有实际用途)。文件是存储在磁盘上的某个东西的句柄。如果您没有句柄,那么为什么要创建一个文件呢?

因此,这个问题可以解释为有两种可能的含义1

1. 创建一个新缓冲区(不考虑名称)

新缓冲区必须有一个名称。可以使用write-file (C-x C-w)将未保存的缓冲区保存到具有给定名称的文件中。您将被提示输入路径/名称。一旦写入,缓冲区将更新为正在访问您刚刚写入的文件。

由于缓冲区的名称并不重要(直到您将其写入文件),因此这里有一个函数,它创建了名为*scratch1**scratch2*等的缓冲区。

(defun create-scratch-buffer ()
  "Create a new numbered scratch buffer.

Taken from URL `https://dev59.com/QnVC5IYBdhLWcg3woCnN#21058075' "
  (interactive)
  (let ((n 0)
    bufname)
    (while (progn
         (setq bufname (concat "*scratch"
                   (if (= n 0) "" (int-to-string n))
                   "*"))
         (setq n (1+ n))
         (get-buffer bufname)))
    (switch-to-buffer (get-buffer-create bufname))
             (org-mode)
  (if (= n 1) initial-major-mode)))

2. 创建新文件(不考虑名称)

如新缓冲区解决方案中所示,可以使用write-file创建新文件。

当以交互方式调用(M-x make-random-file)时,此函数会提示输入目录。然后,它会写入一个名为类似于tmp-17388716387615.txt的空文件。

(defun make-random-file (dir)
  "Make a random file in DIR."
  (interactive "DDir: ")
  (let* ((filename (concat "tmp-" (int-to-string (random t)) ".txt"))
     (filepath (concat dir filename)))
    (write-region "" nil filepath nil 'silent nil 'excl)))

如果上面的代码不太明白,请查看相应的函数和变量文档,分别使用C-h fC-h v命令。或者阅读Emacs Lisp编程入门

1 当我发现这是搜索引擎中排名最高的结果时,我正在寻找第二个意义的解决方案。如果有点晦涩难懂,敬请谅解。我认为与其不分享我的解决方案,还不如与大家分享。 :)


1
您可以尝试以下代码片段,只需将其添加到您的.emacs文件中。
(defun new-file-tmp()
  "Create a new empty file."
  (interactive)
  (let ((buf (generate-new-buffer "untitled")))
(switch-to-buffer buf)

(put 'buffer-offer-save 'permanent-local t)
(setq buffer-offer-save t)))

(defun tool-bar-local-item-pre (icon def key map after_item &rest props)
  "Add an item to the tool bar in map MAP.
ICON names the image, DEF is the key definition and KEY is a symbol
for the fake function key in the menu keymap. Remaining arguments
PROPS are additional items to add to the menu item specification. See
Info node ‘(elisp)Tool Bar’. The item is added after AFTER_ITEM.
ICON is the base name of a file containing the image to use. The
function will first try to use low-color/ICON.xpm if ‘display-color-cells’
is less or equal to 256, then ICON.xpm, then ICON.pbm, and finally
ICON.xbm, using ‘find-image’."
  (let* ((image-exp (tool-bar--image-expression icon)))
(define-key-after map (vector key)
  `(menu-item ,(symbol-name key) ,def :image ,image-exp ,@props) after_item)
  (force-mode-line-update)))

(when (boundp 'tool-bar-map)
  (tool-bar-local-item-pre "new" 'new-file-tmp 'new-file-tmp tool-bar-map
               'new-file :label "" :help "New untitled File")
  (define-key tool-bar-map (vector 'new-file) nil)
;; comment the above line if you want to keep the button for the default behavior
  )
(global-set-key (kbd "C-n") 'new-file-tmp)

它定义了一个新的命令,用于创建新的空缓冲区。如果您在GUI模式下,则将其绑定到工具栏左上角的按钮,如果您使用Control-n快捷键,则也可以使用该命令。 您可以查看我的网站上的帖子以获取更多信息。 免责声明:这是我的网站。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接