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

时间:2014-11-17 18:08:54

标签: emacs

这是一个非常简单的请求:我想创建一个新的空白文件而不给它一个名字(还)。我可以使用暂存缓冲区,但只有一个。我可以C-x C-f并打开一个新文件,但是我必须给它一个名字和路径。如果我只是给自己写笔记或草拟想法,我不想给它起个名字。如何创建一个新的空的未命名文件?

5 个答案:

答案 0 :(得分:8)

您可以使用以下命令创建新缓冲区: Cx b 并输入缓冲区名称,它将创建一个具有您选择名称的新缓冲区。

如果要保存该缓冲区,只需按 C-x w 即可将文件及其内容创建到所需位置。

我的建议是你试试org-mode。它会做出其他一百万件事所需要的东西。

答案 1 :(得分:5)

为其命名。 只是不保存。

不是你想听到的,但这是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?在您提供的文件名中提供文件扩展名会自动将缓冲区置于正确的主模式(通常)。否则(对于C-x b),您需要将缓冲区置于所需的模式。

默认情况下,缓冲区*scratch*是Lisp-Interaction模式,类似于Emacs-Lisp模式(但不一样)。

答案 2 :(得分:3)

在每个其他文本编辑器或文字处理器中,直觉是创建“新文件”或“新缓冲区”,而不是切换到特殊的*scratch*缓冲区。例如,您可以在几个不同的缓冲区中编写快速笔记或想法以跟踪它们 - 稍后您决定是将它们丢弃还是保存它们。或者您操作一段文本或代码,但您不想更改原始缓冲区,因此您只需将其复制到新的临时缓冲区。

*scratch*设置为Lisp Interaction模式,但如果我想快速评估一些Elisp代码,我可以评估它运行eval-expression Alt +:)或Elisp解释器IELM( Alt + x输入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缓冲区时,它也很直观,因此请查看my solution如何在关闭修改后的缓冲区之前将kill-buffer升级为提示。

ErgoEmacs完全修改了默认的键绑定,并且new-empty-buffer绑定到 Ctrl + N ,就像在几乎所有软件中一样。如果您希望新缓冲区在启动时具有其他模式,请更改变量initial-major-mode

另见:

答案 3 :(得分: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快捷键。

您可以检查post on my site。 免责声明:这是我的网站

答案 4 :(得分:0)

缓冲区文件 不相同

术语

关于buffers

  

您在Emacs中编辑的文本位于名为a的对象中   缓冲区。每次访问文件时,都会使用缓冲区来保存文件的文本。

关于files

  

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

缓冲区和文件通过visiting相关

  

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

回答问题

除非从技术上来讲我是错误的,否则您所写的问题将无法得到回答。从脚步上讲,没有诸如未命名文件之类的东西(或几乎没有实际用途)。文件是存储在磁盘上的东西的句柄。如果您没有句柄,那为什么要创建文件?

然后可以将该问题解释为具有两个可能的含义 1

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

新缓冲区必须具有名称。可以使用write-fileC-x C-w)将未保存的缓冲区保存到具有给定名称的文件中。系统将提示您输入路径/名称。写入后,缓冲区更新将访问您刚刚写入的文件。

由于缓冲区的名称无关紧要(直到您将其写入文件),所以下面的函数可创建名为*scratch1**scratch2*,...的缓冲区。

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

Taken from URL `https://stackoverflow.com/a/21058075/5065796' "
  (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。和/或阅读Introduction to Programming in Emacs Lisp

1 这是我寻找解决方案的第二个含义,当我发现这是最受欢迎的搜索引擎时。抱歉,这有点钝。认为最好与所有人共享我的解决方案。 :)