Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:打开一个临时缓冲区,显示可执行文件';s输出_Vim_Makefile - Fatal编程技术网

Vim:打开一个临时缓冲区,显示可执行文件';s输出

Vim:打开一个临时缓冲区,显示可执行文件';s输出,vim,makefile,Vim,Makefile,我发现:cwindow命令非常有用,我想知道是否可以使用编译代码的输出获得类似的功能。我想要:!”的输出/a、 输出以显示在“快速修复”样式的缓冲区中 我还注意到,即使采取了标准步骤来防止出现“按Enter键继续”消息,在:make和:!上仍会发生至少一次/a、 out-使用:silent来抑制这会导致我的tmux完全为空。我当前的解决方法涉及到大量回车的映射,还有其他方法吗?当然,您可以使用vim的预览窗口和一个短函数来执行命令,请在您的.vimrc中尝试此方法: fun! Runcmd(cm

我发现
:cwindow
命令非常有用,我想知道是否可以使用编译代码的输出获得类似的功能。我想要
:!”的输出/a、 输出
以显示在“快速修复”样式的缓冲区中


我还注意到,即使采取了标准步骤来防止出现
“按Enter键继续”
消息,在
:make
:!上仍会发生至少一次/a、 out
-使用
:silent
来抑制这会导致我的tmux完全为空。我当前的解决方法涉及到大量回车的映射,还有其他方法吗?

当然,您可以使用vim的预览窗口和一个短函数来执行命令,请在您的.vimrc中尝试此方法:

fun! Runcmd(cmd)
    silent! exe "noautocmd botright pedit ".a:cmd
    noautocmd wincmd P
    set buftype=nofile
    exe "noautocmd r! ".a:cmd
    noautocmd wincmd p
endfun
com! -nargs=1 Runcmd :call Runcmd("<args>")
并在预览窗口中查看
ls
的结果

我发现:

" Shell ------------------------------------------------------------------- {{{

function! s:ExecuteInShell(command) " {{{
    let command = join(map(split(a:command), 'expand(v:val)'))
    let winnr = bufwinnr('^' . command . '$')
    silent! execute  winnr < 0 ? 'botright vnew ' . fnameescape(command) : winnr . 'wincmd w'
    setlocal buftype=nowrite bufhidden=wipe nobuflisted noswapfile nowrap nonumber
    echo 'Execute ' . command . '...'
    silent! execute 'silent %!'. command
    silent! redraw
    silent! execute 'au BufUnload <buffer> execute bufwinnr(' . bufnr('#') . ') . ''wincmd w'''
    silent! execute 'nnoremap <silent> <buffer> <LocalLeader>r :call <SID>ExecuteInShell(''' . command . ''')<CR>:AnsiEsc<CR>'
    silent! execute 'nnoremap <silent> <buffer> q :q<CR>'
    silent! execute 'AnsiEsc'
    echo 'Shell command ' . command . ' executed.'
endfunction " }}}
command! -complete=shellcmd -nargs=+ Shell call s:ExecuteInShell(<q-args>)
nnoremap <leader>! :Shell

" }}}
“外壳-------------------------------------------------------------------{{{
函数!s:ExecuteInShell(命令)”{{{
let command=join(映射(拆分(a:command),'expand(v:val)'))
让winnr=bufwinnr(“^.”命令“$”)
静默!执行winnr<0?'botright vnew'.fnamescape(命令):winnr。'wincmd w'
setlocal buftype=nowrite bufhidden=wipe noswapfile nowrap nonumber
回显“执行”。命令。“…”
静默!执行“静默%!”。命令
安静!重画
静默!执行'au BufUnload execute bufwinnr('.bufnr('#')。''wincmd w''
静默!执行'nnoremap r:call ExecuteInShell(''.command'.''):AnsiEsc'
静默!执行'nnoremap q:q'
安静!执行“AnsiEsc”
回显“Shell命令”。命令“已执行”
endfunction“}}}
command!-complete=shellcmd-nargs=+Shell调用s:ExecuteInShell()
nnoremap!:Shell
" }}}

在steve losh的.vimrc中——我无耻地复制了它。

我刚刚发现了
:read
命令,它将shell命令的输出放入窗口

我之所以这样做是因为我经常想在当前目录中搜索包含特定字符串的文件(然后将其打开到我当前的VIM中)

这是我的
$MYVIMRC
中的快捷方式:

noremap <leader>g :new<CR>:read ! grep -rn "
坐在指挥区等我。现在我只需键入搜索字符串,关闭双引号并点击
,缓冲区就会被命令输出填满

一旦完成,一个简单的

:bw!

新的缓冲区将杀死它。

首先打开一个预览窗口,并将其设置为自动读取文件:

:botr pedit +:setl\ autoread /tmp/out.log
现在只需运行命令,并将输出发送到该文件

:!date > /tmp/out.log 2>&1
命令的结果应显示在预览窗口中

但是,我们仍然会收到“按ENTER键”提示。避免这种情况的一种简单方法是为我们制作一个按Enter键的映射:

:nmap <Leader>r :exec '!date > /tmp/out.log 2>&1'<CR><CR><CR>
:nmap r:exec'!日期>/tmp/out.log 2>&1'

我原以为只需要两个
s,但后来发现自己需要三个。

这导致vim给我彩色的“按ENTER”提示,尽管我已采取措施避免出现这种提示(setcmdheight=2)。有什么办法可以避免这种情况吗?嗯,我在gvim中没有遇到这种情况,但是我现在在vim中尝试过,并且看到了这个问题。尝试上面的方法,它为我解决了这个问题。这对那个案例很有效,不幸的是,我没有在实际的可执行文件上测试它——现在我已经发现了其他问题
code
:Runcmd./a.out
code
将用二进制噪声填充预览屏幕,
code
:Runcmd a.out
code
将再次导致“按Enter”提示,仅输出“Shell returned X”即可操作格式非常糟糕,我已退出编辑窗口,抱歉!下面是我的一个D项目中的:Runcmd./test的输出:为此,我曾经找到了以下解决方案,它将搜索结果放入QuickFix窗口,并突出显示匹配项以便于导航。vimrc中的3行:1)get窗口:
autocmd QuickFixCmdPost*嵌套cwindow 20 |重画2)实际命令:
命令-nargs=+Grep执行“let@/=”| set hlsearch | silent Grep-rI。”
3)方便访问的映射:
noremap g:Grep
:!date > /tmp/out.log 2>&1
:nmap <Leader>r :exec '!date > /tmp/out.log 2>&1'<CR><CR><CR>