有没有办法在vim中显示最后一个命令的输出?

有没有办法在vim中显示最后一个命令的输出?,vim,Vim,当我运行shell命令时,它会要求在末尾键入ENTER,一旦执行,输出将隐藏。有没有办法在不再次运行命令的情况下再次查看它 还有一些内部命令,如make也会运行外部命令,这些命令甚至不会停止输入,因此,如果我的“编译器”设置有错误,命令会在屏幕上闪烁得太快而看不到它。如何查看命令及其输出?(quickfix为空) 更新 产出肯定还在那里。至少在端子vim上。如果我打字 :!cat 上一个命令的输出仍然存在。问题是a)它看起来太像黑客了,我正在寻找一种合适的vim方式b)它在gui vim中不起

当我运行shell命令时,它会要求在末尾键入ENTER,一旦执行,输出将隐藏。有没有办法在不再次运行命令的情况下再次查看它

还有一些内部命令,如
make
也会运行外部命令,这些命令甚至不会停止输入,因此,如果我的“编译器”设置有错误,命令会在屏幕上闪烁得太快而看不到它。如何查看命令及其输出?(quickfix为空)

更新

产出肯定还在那里。至少在端子vim上。如果我打字

:!cat

上一个命令的输出仍然存在。问题是a)它看起来太像黑客了,我正在寻找一种合适的vim方式b)它在gui vim中不起作用在执行命令之前,您可以将输出重定向到文件、寄存器、选择、剪贴板或变量。对我来说,重定向到寄存器是最实际的解决方案

要开始重定向到注册
a
,请使用

:redir @a
然后运行命令,比如

:!ls -l
并结束重定向

:redir END
就这样,register
a
现在包含重定向命令的输出。您可以使用
:reg a
查看它,也可以使用
“ap
将其放入缓冲区,就像您通常使用寄存器一样

阅读
:redir
的帮助,了解更多有关重定向的各种方法


几个月后,我发现了一个帮助文件,您可能有兴趣查看:


虽然不完整,但它帮助很大。有一个名为
g的命令(对我来说是新的),我通常使用
:sh
退出shell,它将显示所有已执行但未重定向其输出的命令的输出


只需关闭外壳,您将回到vim的内部。

将vim置于后台通常对我有效(按Ctrl+Z)

这将向您展示启动vim的shell,在我的例子中,我可以通过“:”看到我在vim中运行的所有命令的输出!somecommand”


这是假设您从shell而不是gui(gvim)运行vim

:edit <C-r>=&errorfile<CR>
:编辑=&errorfile
(不幸的是,这似乎不适用于
:grep


redir
不必繁琐。请参阅,以简化它。(我有和脚本使输出缓冲区不受文件支持。)


当您键入
:!cat
时,您会在终端上看到输出,这是因为您的终端,而不是vim。如果您使用Ctrl-z暂停vim,则vim不会主动执行任何操作,您会看到相同的结果。

向上滚动(在iTerm 2上测试)。注意:这可能不起作用,具体取决于您的vim配置

示例:我将要从我的vim运行
!rspec--color%

缓冲区中充满了输出

现在,在点击
ENTER
后,您可以向上滚动查看上一个输出

只需键入:! 或者您可以尝试找到此脚本,它将打开一个新选项卡

function! s:ExecuteInShell(command)
  let command = join(map(split(a:command), 'expand(v:val)'))
  let winnr = bufwinnr('^' . command . '$')
  silent! execute  winnr < 0 ? 'botright new ' . fnameescape(command) : winnr . 'wincmd w'
  setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap number
  echo 'Execute ' . command . '...'
  silent! execute 'silent %!'. command
  silent! execute 'resize ' . line('$')
  silent! redraw
  silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
  silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>'
  echo 'Shell command ' . command . ' executed.'
endfunction
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)
function!s:ExecuteInShell(命令)
let command=join(映射(拆分(a:command),'expand(v:val)'))
让winnr=bufwinnr(“^.”命令“$”)
静默!执行winnr<0?'botright new'.fnameescape(命令):winnr。'wincmd w'
setlocal buftype=nowrite bufhidden=wipe noswapfile nowrap编号
回显“执行”。命令。“…”
静默!执行“静默%!”。命令
静默!执行“调整大小”。行(“$”)
安静!重画
静默!执行'au BufUnload execute bufwinnr('.bufnr('#')。''wincmd w''
静默!执行'nnoremap r:callexecuteinshell(''.command'
回显“Shell命令”。命令“已执行”
端功能
command!-complete=shellcmd-nargs=+Shell调用s:ExecuteInShell()
将其粘贴到您的.vimrc中 它也适用于gui vim


示例用法--:Shell make

也许这些家伙忘记了:r

r !ls ~/
将其放在光标所在的位置:

bug_72440.html
bug_72440.vim
Desktop
dmtools
Docear
docear.sh
Documents
Downloads
examples.desktop
index.html
linux_home
Music
Pictures
Public
Templates
一个简单的u可以在我拉下新文本或其他任何东西后将其删除;

为什么我不再使用
:!
,还有什么选择 我从中学习了
:!
(并且我对它进行了升级)。从某种意义上说,它确实可以显示上一个屏幕

然而,前几天我学到了使用
重新运行最后一个命令的另一个技巧:!!
(顺便说一句,这在编辑测试-编辑测试-编辑测试-循环中非常有用)。然后我意识到,使用
:!
会产生忘记最后一个命令的副作用,因此未来的
:!!
将无法工作。这并不酷

我不明白这一点,直到我深入研究

:!{cmd}使用shell执行{cmd}

{cmd}中的任何“!”都将替换为上一个 外部命令

突然间,一切都开始变得有意义了。让我们按以下顺序进行检查:

  • 假设您第一次运行
    :!生成大量参数
    并查看其输出,稍后返回vim
  • 现在您可以运行
    :!!
    ,第二个
    将替换为上一个外部命令,因此您将再次运行
    make foo bar baz tons parameters
  • 现在,如果您运行
    :!
    ,vim仍会将其视为“启动(新)外部命令”,这只是命令结果为空。因此,这相当于您键入一个空命令(即在普通shell中按一下ENTER键).通过将屏幕切换到shell,您正好有机会看到以前的屏幕输出。就是这样
  • 现在,如果您运行
    :!!
    ,vim将重复前面的命令,但这次是prev