使用emacs创建一个行为类似于scratch的起始缓冲区

4
我的偏好是在创建文档时打开一个空白缓冲区,开始输入一些内容,然后再决定如何命名文件并保存。这就是我使用记事本的方式。但是,对于emacs而言,它会强制您在开始输入之前先决定缓冲区的命名。
目前,当我启动emacs时,我会得到scratch缓冲区。如果我编辑并尝试保存scratch(ctrl-x ctrl-s),它允许我输入我想要在默认目录中保存的位置。我猜scratch是一种没有文件名的虚拟缓冲区。
如果我将起始缓冲区从scratch更改为其他内容,则尝试保存该缓冲区只会保存到我定义的文件中。
我希望有一个空的起始缓冲区,当我尝试保存时,它会让我定义文件名,即在保存时的行为类似于scratch缓冲区,但是它是空的。
*EDIT还有一个问题,当我尝试指定“初始缓冲区选择”时,它会覆盖从其图标启动文档时的选择,怎么避免这个问题?

你的图标有哪些属性(我猜是打开Emacs的快捷方式)?如果图标指定了要打开特定的文件或目录,那么它将覆盖initial-buffer-choice的设置。实际上两者都会执行,但是由快捷方式指定的文件会在后面执行,因此它会显示出来。例如,我在快捷方式中使用以下命令:D:\Emacs-24-2013-10-19\bin\runemacs.exe --debug-init "d:\my\path\to\my\dir",这样Emacs就会打开到该目录。 - Drew
4个回答

3

正如我在评论中提到的,您可以使用空白的刮擦缓冲区。如果您不喜欢它,可以使用,例如,

(setq inhibit-splash-screen t)
(switch-to-buffer "**")

请在你的.emacs文件中加入以下内容:(setq inhibit-splash-screen t),这样在启动后你就可以立即看到**缓冲区了。

关于C-x b的第一个答案后,你可以通过emacs帮助来确定这些按键的用途。你可以使用C-h k来获取感兴趣的按键序列的帮助。


1
这里有一种方法:C-x b。输入一个随机名称,比如temp。 你会得到一个基本模式的缓冲区,它没有绑定到任何文件。 然后你可以按照自己的意愿保存它。

我希望这一切都自动化,这样当我启动emacs时,我就在一个未绑定的缓冲区中。我应该在我的.emacs文件中放什么?谢谢。 - Rob F
1
一种可能的方法是:设置 (setq initial-scratch-message "") 并使用 scratch 缓冲区。 (但也许 lisp-interaction-mode 会干扰?)如果您需要在同一个 Emacs 中创建一个新缓冲区,可以像原始答案建议的那样执行 C-x b - Tobias

0

自定义选项initial-buffer-choice。将其设置为您选择的缓冲区的名称,而不是默认值nil或缓冲区* scratch *t

,----
| initial-buffer-choice is a variable defined in `startup.el'.
| Its value is nil
| 
| Documentation:
| Buffer to show after starting Emacs.
| If the value is nil and `inhibit-startup-screen' is nil, show the
| startup screen.  If the value is a string, switch to a buffer
| visiting the file or directory specified by that string.  If the
| value is a function, switch to the buffer returned by that
| function.  If t, open the `*scratch*' buffer.
| 
| A string value also causes emacsclient to open the specified file
| or directory when no target file is specified.
| 
| You can customize this variable.
| 
| This variable was introduced, or its default value was changed, in
| version 24.4 of Emacs.
`----

(该文档字符串来自最近的Emacs开发快照。Emacs 24.3的文档字符串略有不同。)


我的文档说initial-buffer-choice会运行find-file,这不完全是OP想要的...但也许可以使用“function”功能。 - Tobias
@user2708138:你的文档显然是Emacs 24.3文档(或更早版本)。我提到过它已经不同了。因此,是的,在Emacs 24.4发布之前(应该很快),你需要一个开发快照才能从这个变化中受益。 - Drew
嗯,它是否也会打开一个未访问文件的缓冲区?从上述新文档的陈述中,我不会期望这种情况。唯一的方法是使用“function”功能,不是吗? - Tobias
@user2708138:是的,它会。顺便说一下,Emacs 24.3 的 find-file 行为也是如此,如果文件尚不存在。find-file 不需要文件存在。如果选项值是一个字符串,则将其作为文件名提供给 find-file -- 在 Emacs 24.4 中与 24.3 相同。 - Drew
我认为问题在于缓冲区与给定名称的文件相关联。如果按下 C-x C-s,则使用此名称保存文件。如果使用 switch-to-buffer,则 buffer-file-namenil,Emacs 总是会询问在哪里保存缓冲区。 - Tobias
@user2708138:您所描述的是行为。是否成问题取决于观察者的眼光。这完全取决于一个人想要什么样的行为。(C-x C-w总是询问保存位置...)有很多可能性,每种都有自己的特点。 - Drew

0

我知道这个问题已经有答案了,但我认为其他人(包括原帖作者)可能会感激这个回答。

(defun my/new-scratch ()
    ; Returns the existing *scratch* buffer or creates a new one
    (interactive)
    (switch-to-buffer (get-buffer-create "*scratch*")))

现在你可以将它绑定到任何你喜欢的东西上,而且你可以随时创建一个新的草稿,而不需要每次都启动一个新的emacs。
;; replaces set-goal-column on C-x C-n
(global-set-key (kbd "C-x C-n") 'my/new-scratch)

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