【问题标题】:Close file without quitting VIM application?在不退出 VIM 应用程序的情况下关闭文件?
【发布时间】:2010-09-20 08:24:08
【问题描述】:

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

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

【问题讨论】:

    标签: vim


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      :map <F4> :bd<CR>
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            如果你修改一个文件并且想要关闭它而不退出 Vim 并且不保存,你应该输入:bd!

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

                如果你的 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
                

                【讨论】:

                • 现在这个 sn-p 做了什么?
                • 您可能希望在调用之后使用 来实际执行命令。
                • @dolzenko 它在正常模式下映射 'fc' 和 'fq' 以选择性地保存当前缓冲区,然后在删除原始缓冲区之前切换到新缓冲区。这会保留您设置的所有拆分。
                • 似乎是个好主意。但是,当我尝试它时,我收到以下错误消息:“无法重新定义函数 CleanClose:它正在使用中”
                • 不要重新映射 "f" 。 . . “f”实际上非常有用。使用此映射,您永远无法“找到”前向“c”或“q”。
                【解决方案8】:

                如前所述,您正在寻找: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——“除非你知道自己在做什么,否则不要使用它。”
                【解决方案9】:

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

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

                【讨论】:

                  【解决方案10】:
                  :[N]bd[elete][!] *:bd* *:bdel* *:bdelete* *E516*
                  :bd[elete][!] [N]
                                  卸载缓冲区 [N](默认值:当前缓冲区)并将其从
                                  缓冲区列表。如果缓冲区已更改,则会失败,
                                  除非指定了 [!],否则更改将丢失。
                                  该文件不受影响。此缓冲区的任何窗口都是
                                  关闭。如果缓冲区 [N] 是当前缓冲区,则另一个缓冲区
                                  将改为显示。这是最近的条目
                                  指向已加载缓冲区的跳转列表。
                                  实际上,缓冲区并没有完全删除,而是被删除了
                                  来自缓冲区列表 |unlisted-buffer|和选项值,
                                  缓冲区的变量和映射/缩写是
                                  清除。

                  【讨论】:

                    【解决方案11】:

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

                    :bd 
                    

                    【讨论】:

                    • 对于 OP 的要求,您的比我的要好,尽管我更喜欢 :enew,因为我喜欢在缓冲区列表中包含缓冲区。 :)
                    • 当我这样做时,vim 会显示第一个缓冲区,但我仍然可以访问缓冲区
                    • @Martin,要完全删除缓冲区,请使用 :bw
                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-03-19
                    • 1970-01-01
                    • 2021-10-27
                    • 2017-04-28
                    相关资源
                    最近更新 更多