ChatGPT解决这个技术问题 Extra ChatGPT

在不退出 VIM 应用程序的情况下关闭文件?

vim

我使用 :e:w 命令来编辑和写入文件。我不确定是否有“关闭”命令可以在不离开 Vim 的情况下关闭当前文件?

我知道 :q 命令可以用来关闭一个文件,但如果它是最后一个文件,Vim 也会被关闭;实际上在 Mac OS MacVim 确实退出了。只有 Vim 窗口关闭,我可以使用 Control-N 再次打开一个空白的 Vim 窗口。我希望 Vim 在空白屏幕上保持打开状态。


V
Vinko Vrsalovic

这将删除缓冲区(转换为关闭文件)

:bd 

对于 OP 的要求,您的比我的要好,尽管我更喜欢 :enew 因为我喜欢在缓冲区列表中包含缓冲区。 :)
当我这样做时,vim 显示第一个缓冲区,但我仍然可以访问缓冲区
@Martin,要完全删除缓冲区,请使用 :bw
t
the Tin Man

如前所述,您正在寻找 :bd,但这并没有完全删除缓冲区,它仍然可以访问:

:e foo
:e bar
:buffers
  1 #h   "foo"                          line 1
  2 %a   "bar"                          line 1
Press ENTER or type command to continue
:bd 2
:buffers
  1 %a   "foo"                          line 1
Press ENTER or type command to continue
:b 2
2   bar

相反,您可能想要完全删除它的 :bw

:bw 2
:b 2 
E86: Buffer 2 does not exist

不知道 :bw 困扰了我很长一段时间。


请记住,VIM 的帮助中关于 :bw 的说明是这样的——“除非你知道自己在做什么,否则不要使用它。”
t
the Tin Man

如果你的 Vim 窗口中有多个拆分窗口,那么 :bd 会关闭当前文件的拆分窗口,所以我喜欢使用更高级的东西:

map fc <Esc>:call CleanClose(1)

map fq <Esc>:call CleanClose(0)


function! CleanClose(tosave)
if (a:tosave == 1)
    w!
endif
let todelbufNr = bufnr("%")
let newbufNr = bufnr("#")
if ((newbufNr != -1) && (newbufNr != todelbufNr) && buflisted(newbufNr))
    exe "b".newbufNr
else
    bnext
endif

if (bufnr("%") == todelbufNr)
    new
endif
exe "bd".todelbufNr
endfunction

现在这个片段做了什么?
您可能希望 在调用之后实际执行命令。
@dolzenko 它在正常模式下映射 'fc' 和 'fq' 以选择性地保存当前缓冲区,然后在删除原始缓冲区之前切换到新缓冲区。这会保留您设置的所有拆分。
似乎是个好主意。但是,当我尝试它时,我收到以下错误消息:“无法重新定义函数 CleanClose:它正在使用中”
不要重新映射 "f" 。 . . “f”实际上非常有用。使用此映射,您永远无法“找到”前向“c”或“q”。
e
ephemient
:[N]bd[elete][!]                        *:bd* *:bdel* *:bdelete* *E516*
:bd[elete][!] [N]
                Unload buffer [N] (default: current buffer) and delete it from
                the buffer list.  If the buffer was changed, this fails,
                unless when [!] is specified, in which case changes are lost.
                The file remains unaffected.  Any windows for this buffer are
                closed.  If buffer [N] is the current buffer, another buffer
                will be displayed instead.  This is the most recent entry in
                the jump list that points into a loaded buffer.
                Actually, the buffer isn't completely deleted, it is removed
                from the buffer list |unlisted-buffer| and option values,
                variables and mappings/abbreviations for the buffer are
                cleared.

t
the Tin Man

如果您已经保存了最后一个文件,那么 :enew 就是您的朋友(如果您不想保存最后一个文件,则 :enew!)。请注意,原始文件仍会在您的缓冲区列表中(可通过 :ls 访问的那个)。


t
the Tin Man

如果您修改一个文件并想在不退出 Vim 且不保存的情况下关闭它,您应该输入 :bd!


t
the Tin Man

:bd 可以映射。我将它映射到 F4, Shift-F4 如果我因为一些我不再想要的更改而需要强制关闭。


t
the Tin Man

bufkill.vim 插件添加 BD 等,以删除缓冲区而不关闭任何拆分(如 bd)单独。


t
the Tin Man

在 .vimrc 文件中插入以下内容,然后按 F4,它将关闭当前文件。

:map <F4> :bd<CR>

t
the Tin Man

查看 Butane plugin 以在关闭缓冲区时保持窗口布局。


J
Joannes

对我来说 close-buffers 是非常有用的插件:

:Bdelete this 关闭,您可以重新映射。


T
Takashi Kojima

我有同样的问题,所以我做了插件。这个插件替换 :q 和其他命令然后防止窗口关闭。

如果您仍然有问题,请尝试使用以下插件。 https://github.com/taka-vagyok/prevent-win-closed.vim