如何在退出vim后清除屏幕

8
有时候在终端上退出 Vim 后会留下一些东西,如“按任意键继续”,有没有办法在退出 Vim 后返回到一个清空的终端界面? 我对 Vim 还不熟悉,请告诉我应该怎么做。
抱歉,我第一次表达得不够清楚。实际上,我想问的是:在 Vim 中输入 :q 后是否有办法在不进一步输入命令的情况下返回到一个清空的终端界面。 我正在使用 Ubuntu 上的 VIM 7.4,终端类型是 xterm。

vim通常不应该这样做——但即使它这样做了,有什么伤害呢? - Keith Thompson
请指定您正在使用的平台和终端。 - merlin2011
VIM 7.4 在 Ubuntu 上,终端类型为 xterm。 - jcxl
6个回答

13

将以下内容添加到你的~/.vimrc文件中:

au VimLeave * :!clear

4

我使用别名来清除任何退出方法,包括:q:wqa。(这是针对我的OSX二进制文件的,您需要找到自己的vim二进制文件,使用which vim命令)

# .zshrc
alias vim="/usr/local/Cellar/vim/8.0.0094/bin/vim && clear"

1
如此简单,如此强大,却被人们所忽视 :) - user2095363
2
这个解决方案有点可行,但并不是很好,因为它阻止了将参数传递给vim,并且clear命令实际上并没有清除滚动缓冲区,除非定义了E3功能(在标准Ubuntu的bash中没有定义)。 - EntangledLoops
我同意,我也觉得它不够好,而且我还没有找到一个让我真正满意的解决方案。 - Plato
1
我完全受到这个答案的启发,但是为了回应这个答案中的评论:请在你的.bashrc文件中添加以下行,并注明原因:function vim { vim "$@" && clear; }这样可以让你传递参数给vim,但也会在任何方式退出vim后清除终端屏幕。如果这不适用于zshxterm,我深表歉意! - LT 'syreal' Jones

2

通过编辑.vimrc文件,可以实现更多功能。

将以下内容添加到您的 .vimrc 文件中:

command Qc :call ClearAndExit()
function ClearAndExit()
    :!clear
    :q!
endfunction

使用:Qc来退出... 它还会清除屏幕。


1
在此之前,请在您的终端输入 export TERM=xterm,然后尝试相同的操作。 - manoj
这是我获取信息的链接:http://unix.stackexchange.com/questions/60499/how-to-set-the-bash-display-to-not-show-the-vim-text-after-exit - manoj
我已经编辑了答案,并进行了.vimrc的更改。 - manoj
你尝试了哪一个?是.vimrc还是更改TERM? - manoj

1
如果 Vim 编译时支持切换 xterm 屏幕,则可以默认执行此操作,只需设置 t_tit_te>(通常 Vim 会自动确定这些值)。详细信息请参见 :h xterm-screens(以下是粘贴内容)。

(来自comp.editors,由Juergen Weigert回答一个问题)

:>另一个问题是,在退出vim后,屏幕保持不变,即我正在查看(编辑)的文件内容仍留在屏幕上。我的先前输出“ls”的结果丢失了,即不再在滚动缓冲区中。我知道有一种方法可以在退出vim或其他类似vi的编辑器后恢复屏幕,但我不知道如何操作。谢谢您的帮助。

:我想其他人可以回答这个问题。我假设vim和vi在给定的xterm设置下执行相同的操作。

它们不一定执行相同的操作,因为这可能是termcap与terminfo之间的问题。您应该知道,描述特定类型终端属性的两个数据库:termcap和terminfo。当条目不同时,这可能会导致差异,并且当涉及到一个程序使用terminfo而另一个程序使用termcap时,也会出现差异(请参阅+terminfo)。

在您的特定问题中,您正在寻找控制序列^[[?47h和^[[?47l。它们在xterms备用和主屏幕缓冲区之间切换。作为快速解决方案,像这样的命令序列 echo -n "^[[?47h"; vim ... ; echo -n "^[[?47l"可以实现您的要求。(我的符号^ [表示ESC字符,稍后您将看到数据库使用\E)。

在启动时,vim会将termcap变量ti(terminfo:smcup)的值回显到终端。退出时,它会回显te(terminfo:rmcup)。因此,这两个变量是上述控制序列应放置的正确位置。

比较您的xterm termcap条目(在/etc/termcap中找到)和xterm terminfo条目(使用“infocmp-C xterm”检索)。两者都应包含类似于以下条目: :te=\E[2J\E[?47l\E8:ti=\E7\E[?47h:

PS:如果您发现任何差异,则应该有人(您的系统管理员?)更好地检查完整的termcap和terminfo数据库的一致性。

注意1:如果您重新编译带有FEAT_XTERM_SAVE定义的Vim,则内置的xterm将包括上述的“te”和“ti”条目。

注意2:如果您想禁用屏幕切换,并且不想更改termcap,则可以将以下行添加到.vimrc中: :set t_ti= t_te=


0

我不想使用不同的命令来退出Vim(例如,像suggested中建议的:Qc),而EntangledLoops的.vimrcmethod对我无效。

受柏拉图answer的启发,我在.bashrc中放置了以下函数,找到了类似的解决方案:

# Vim exits to clear terminal screen
function vim {
   /usr/bin/env vim "$@" && clear
}

在函数内仅使用vim是有问题的,因为函数会递归调用自身并创建一个无限循环,但添加/usr/bin/env可以消除这个问题,忽略函数并执行PATH中第一个vim


0

可以的。你完全可以这样做。

使用UNIX命令清除屏幕。 clear


3
在命令提示符处键入 Control-L。 - Keith Thompson
一个常见问题是(为什么我在按下Control/L键时屏幕没有清空?)。 - Thomas Dickey
抱歉,我没有表达清楚我的想法。实际上,我想问的是,在vim中输入:q后,是否有一种方法可以在不进一步输入命令的情况下返回到清晰的终端。 - jcxl

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