什么是暂存窗口?


10

有时我会看到一个打开的窗口,其中显示name scratch

我知道这是某种临时缓冲区/窗口。

我该如何装箱?

:h scratch 什么也不返回。

Answers:


11

它可能是暂存缓冲区,可以命名。从帮助中:

包含可以随时丢弃的文本。关闭窗口时将保留它,必须将其显式删除。设置:>

      :setlocal buftype=nofile
      :setlocal bufhidden=hide
      :setlocal noswapfile
  The buffer name can be used to identify the buffer, if you give it a meaningful name.

可以在中找到:help special-buffers


1
哪个:h命令用于访问此帮助?
wizzup

2
:h缓冲区,然后通过“特殊类型的缓冲区”读取。您在正确的轨道上。
wbogacz

使用任何Vim命令打开文件时,都会自动创建一个缓冲区。例如,如果您使用:edit文件编辑文件,则会自动创建一个新的缓冲区。可以通过输入:enew:new或创建空缓冲区:vnew。从Vim缓冲区常见问题解答中:vim.fandom.com/wiki/Vim_buffer_FAQ
NeilG

2
@wizzup :helpgrep scratch将其显示为10个结果(在我的安装中)之一。
丰富

2

我记得关于该主题的vim技巧(已迁移到vim.wikia)。

我用于创建暂存缓冲区的函数的最新版本也进行了设置:

  • 'buflisted' 虚假
  • 'readonly'

(来自我的VimL库插件:lh-vim-lib)

function! lh#buffer#scratch(bname, where) abort
  try
    set modifiable
    " The next function takes care of working around this damn E36
    call lh#window#create_window_with(a:where.' sp '.escape(substitute(a:bname, '\*', '...', 'g'), '#%'))
  catch /.*/
    throw "Can't open a buffer named '".a:bname."'!"
  endtry
  setlocal bt=nofile bh=wipe nobl noswf ro
  return bufnr('%')
endfunction

2

“临时”缓冲区只是用于键入任意临时内容的场所的非正式术语。

按照公认的答案和另一个问题,我在vimrc中创建了以下函数。

该函数在当前窗口中创建一个空白缓冲区,并将其命名为“ scratch”。如果您尝试退出,暂存缓冲区不受保护。如果退出Vim或擦除Vim(:bw),即使没有保存更改,它也将被丢弃而不会提示。

将此功能放在vimrc中。要创建暂存缓冲区,请使用:call Scratch()

function! Scratch()
    split
    noswapfile hide enew
    setlocal buftype=nofile
    setlocal bufhidden=hide
    "setlocal nobuflisted
    "lcd ~
    file scratch
endfunction

您可以通过拖拉各行然后快速进行测试:@"。然后可以尝试:call Scratch()

使用拆分,因此在创建暂存缓冲区时,当前缓冲区不会受到影响。

(如果您希望split从函数中省略from,那么当您创建暂存缓冲区时,您当前的缓冲区将被“隐藏”(不再在窗口中)。Vim仍会停止并提示您,如果您尝试使用未保存的更改退出缓冲)。

暂存缓冲区通常具有与调用Scratch函数时所在缓冲区相同的工作目录。我已包括一条注释行,用于将暂存缓冲区工作目录更改为home。这适用于那些状态栏很有趣的人,它们可能会将当前目录的路径显示为缓冲区路径。或仅适合那些喜欢它的人。

您可以将暂存缓冲区设置为“列出”或“不列出”(默认列出)。如果您将其:buffers设为不公开,则您不会在列表中看到它,但是它将在中:buffers!nobuflisted如果您希望将其取消列出,请取消注释该行。列出或不列出,始终可以随时更改为暂存缓冲区:b scratch。列出暂存缓冲区会使它更易于访问。例如:sball将其包含在拆分中。

如果:bw在暂存缓冲区上使用(缓冲区擦除),Vim会删除内容并删除缓冲区,而不会发出警告。如果:bd在暂存缓冲区上使用(删除缓冲区),Vim会在没有警告的情况下删除内容,并使缓冲区不列出。

可以创建多个暂存缓冲区。Vim开始抱怨,但您仍然会遇到其他问题。


2
执行的arent是必要的。你的函数可以只运行enew等
D.本Knoble

1
如果buftype=hide 设置名称之前进行设置,则无需更改目录,因为缓冲区名称不会像文件名那样被处理。另外,可能值得一提的是'nobuflisted',它防止缓冲区显示在的输出中:ls。您有点提到它,但没有明确提及它。
丰富

感谢您的评论,@ D.BenKnoble。我已经根据您的建议清理了该功能。
NeilG

1
buftype=hide确实是胡说八道,是的,我实际上是在谈论buftype=nofile:)。但是我无法重现您描述的行为,并且仍然认为该语句Vim buffer names are always filenames是错误的。如果我cd从您的函数中删除该行然后运行它,那么我的状态行或输出中就没有路径,echo bufname('%')我想知道这是否可能是您的状态行而不是缓冲区名称的问题。您的'statusline'选择设置为什么?
丰富

1
啊哈!很高兴我们知道了!如果是我,我仍然不希望在Scratch函数中更改目录,所以我改statusline使用expand(&buftype == 'nofile' ? '%' : '%:p:~:h'),但我认为现在我们进入了个人喜好领域。如果您决定坚持使用更改目录解决方案,那么最好:lcd将更改限制在所讨论的窗口中,但这再次取决于您。无论如何,我认为这是一个很好的答案。+1!
丰富
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.