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

时间:2011-04-17 14:04:29

标签: vim

当我运行一个shell命令时,它要求在结尾处输入ENTER,一旦你输出,就会隐藏输出。有没有办法再次看到它而没有再次运行命令?

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

更新

输出仍然存在。至少在终端vim上。如果我输入

:!cat

上一个命令的输出仍然存在。问题是a)它似乎太像一个黑客,我正在寻找一个适当的vim方式b)它不适用于gui vim

9 个答案:

答案 0 :(得分:55)

只需键入:! 或者你可以尝试SingleCompile

答案 1 :(得分:34)

将vim放入背景通常对我有用(按Ctrl + Z)。

这将显示你从vim开始的shell,在我的情况下,我可以通过“:!somecommand”看到我在vim中运行的所有命令的输出。

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

答案 2 :(得分:23)

在执行命令之前,您可以将输出重定向到文件,寄存器,选择,剪贴板或变量。对我来说,重定向到寄存器是最实用的解决方案。

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

:redir @a

然后你运行你的命令,比如说

:!ls -l

结束重定向

:redir END

就是这样,寄存器a现在包含重定向命令的输出。您可以使用:reg a查看它或使用"ap放入缓冲区,就像使用注册表一样。

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


几个月后,我找到了一个您可能有兴趣看看的帮助文件:messages.txt

虽然不完整,但它有很多帮助。有一个名为g<的命令(对我而言)显示最后给出的消息,但显然只有Vim消息,如[No write since last change]

首先,我建议您查看'shm'的设置,并尝试使命令输出更持久(更频繁地出现“Hit ENTER”)。然后,检查这个帮助文件是否有帮助:-)我无法让它100%工作,但这是一个很大的进步。

答案 3 :(得分:7)

我通常使用:sh退出到shell,这将显示已执行的所有命令的输出,并且没有重定向它的输出。

只需关闭外壳,您就会回到vim内部。

答案 4 :(得分:2)

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

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

enter image description here

缓冲区充满了输出。

enter image description here

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

enter image description here

答案 5 :(得分:2)

也许那些人忘记了: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

一个简单的你可以在我拿起它之后摆脱新文本;

答案 6 :(得分:2)

为什么我不再使用:!,又有什么选择

我从currently chosen answer学习:!(我赞成它)。从某种意义上说它确实显示了前一个屏幕。

然而,前几天我学习了另一个使用:!!重新运行最后一个命令的提示(顺便说一下,当你进行编辑测试编辑测试时,它非常有用。 ..周期)。然后我意识到,使用:!会以某种方式产生忘记最后一个命令的副作用,以便将来:!!不起作用。那不太酷。

我不明白这一点,直到我深入研究vim's documentation

  

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

     

任何'!'在{cmd}中替换为前一个               外部命令

突然间,一切都开始变得有意义了。让我们按照这个顺序检查它:

  1. 假设您首先运行:!make foo bar baz tons of parameters并查看其输出,稍后再回到vim。
  2. 现在您可以运行:!!,第二个!将替换为上一个外部命令,因此您将再次运行make foo bar baz tons of parameters
  3. 现在,如果你运行:!,vim仍将它视为“启动(新)外部命令”,只是命令结果是EMPTY。所以这相当于你输入一个空命令(即在普通shell中命中一次ENTER)。通过将屏幕切换到shell,您可能会有机会看到之前的屏幕输出。就是这样。
  4. 现在,如果你运行:!!,vim将重复上一个命令,但这一次,前一个命令是一个空命令。这就是为什么你的vim失去了make foo bar baz tons of parameters的记忆,所以下次你想做的时候,你将不得不再次打字。
  5. 那么,下一个问题是,还有其他“纯vim命令”只显示以前的shell输出而不会弄乱最后一个命令内存吗?我不知道。但现在我决心使用 CTRL + Z 将vim带到后台,因此显示shell控制台的前一个命令输出,然后我输入fg ENTER 切换回vim。 FWIW,CTRL+Z解决方案实际上需要比:!解决方案少一个关键笔划(需要 shift + ; shift + 1 ENTER 显示命令屏幕, ENTER 返回)。

答案 7 :(得分:1)

找到此脚本 - 这将打开一个新标签

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>)

将其粘贴到.vimrc中 它也适用于gui vim ..

示例用法 - :Shell make

答案 8 :(得分:0)

make之类的命令会将其输出保存到/tmp/vsoMethingerrorfile设置似乎设置为支持quickfix / location列表的文件。如果您希望输出特定于某处,请参阅makeef。您可以打开当前的错误文件:

:edit <C-r>=&errorfile<CR>

(不幸的是,这似乎不适用于:grep。)


redir不一定非常单调乏味。有关简化,请参阅this plugin。 (我有ftdetectftplugin脚本使输出缓冲区不受文件支持。)


由于您的终端而不是vim,当您键入:!cat时,您会看到终端上的输出。如果您使用 Ctrl - z 暂停vim,那么你会看到同样的事情,所以vim没有主动做任何事情。