当我运行一个shell命令时,它要求在结尾处输入ENTER,一旦你输出,就会隐藏输出。有没有办法再次看到它而没有再次运行命令?
此外,一些内部命令(如make
)也会运行外部命令,而那些甚至不会因为ENTER而停止,因此如果我的“编译器”设置中出现错误,则命令会在屏幕上闪烁太快而无法看到它。如何查看命令及其输出? (quickfix为空)
更新
输出仍然存在。至少在终端vim上。如果我输入
:!cat
上一个命令的输出仍然存在。问题是a)它似乎太像一个黑客,我正在寻找一个适当的vim方式b)它不适用于gui vim
答案 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
后,您可以向上滚动以查看上一个输出。
答案 5 :(得分:2)
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}中替换为前一个 外部命令
突然间,一切都开始变得有意义了。让我们按照这个顺序检查它:
:!make foo bar baz tons of parameters
并查看其输出,稍后再回到vim。:!!
,第二个!
将替换为上一个外部命令,因此您将再次运行make foo bar baz tons of parameters
。:!
,vim仍将它视为“启动(新)外部命令”,只是命令结果是EMPTY。所以这相当于你输入一个空命令(即在普通shell中命中一次ENTER)。通过将屏幕切换到shell,您可能会有机会看到之前的屏幕输出。就是这样。:!!
,vim将重复上一个命令,但这一次,前一个命令是一个空命令。这就是为什么你的vim失去了make foo bar baz tons of parameters
的记忆,所以下次你想做的时候,你将不得不再次打字。那么,下一个问题是,还有其他“纯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/vsoMething
。 errorfile
设置似乎设置为支持quickfix / location列表的文件。如果您希望输出特定于某处,请参阅makeef
。您可以打开当前的错误文件:
:edit <C-r>=&errorfile<CR>
(不幸的是,这似乎不适用于:grep
。)
redir
不一定非常单调乏味。有关简化,请参阅this plugin。 (我有ftdetect和ftplugin脚本使输出缓冲区不受文件支持。)
由于您的终端而不是vim,当您键入:!cat
时,您会看到终端上的输出。如果您使用 Ctrl - z 暂停vim,那么你会看到同样的事情,所以vim没有主动做任何事情。