有没有办法在vim中显示最后一个命令的输出?
当我运行shell命令时,它会要求在末尾键入ENTER,一旦执行,输出将隐藏。有没有办法在不再次运行命令的情况下再次查看它 还有一些内部命令,如有没有办法在vim中显示最后一个命令的输出?,vim,Vim,当我运行shell命令时,它会要求在末尾键入ENTER,一旦执行,输出将隐藏。有没有办法在不再次运行命令的情况下再次查看它 还有一些内部命令,如make也会运行外部命令,这些命令甚至不会停止输入,因此,如果我的“编译器”设置有错误,命令会在屏幕上闪烁得太快而看不到它。如何查看命令及其输出?(quickfix为空) 更新 产出肯定还在那里。至少在端子vim上。如果我打字 :!cat 上一个命令的输出仍然存在。问题是a)它看起来太像黑客了,我正在寻找一种合适的vim方式b)它在gui vim中不起
make
也会运行外部命令,这些命令甚至不会停止输入,因此,如果我的“编译器”设置有错误,命令会在屏幕上闪烁得太快而看不到它。如何查看命令及其输出?(quickfix为空)
更新
产出肯定还在那里。至少在端子vim上。如果我打字
:!cat
上一个命令的输出仍然存在。问题是a)它看起来太像黑客了,我正在寻找一种合适的vim方式b)它在gui vim中不起作用在执行命令之前,您可以将输出重定向到文件、寄存器、选择、剪贴板或变量。对我来说,重定向到寄存器是最实际的解决方案 要开始重定向到注册
a
,请使用
:redir @a
然后运行命令,比如
:!ls -l
并结束重定向
:redir END
就这样,registera
现在包含重定向命令的输出。您可以使用: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