6

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

我还注意到,即使在采取标准步骤来阻止"Press Enter to continue"消息之后,它仍然至少会发生一次:make并且:!./a.out- 使用:silent来抑制这会导致我的 tmux 完全空白。我当前的解决方法涉及带有大量回车的映射,还有其他方法吗?

4

4 回答 4

11

当然,你可以使用 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>")

那么你也能:

:Runcmd ls

ls并在预览窗口中查看结果

于 2012-05-08T09:15:41.677 回答
3

我找到了这个:

" 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

" }}}

在 steve losh 的 .vimrc 中 -看看我无耻地复制了哪个。

于 2012-05-09T08:09:29.167 回答
0

我刚刚发现了这个:read命令,它将 shell 命令的输出放到一个窗口中。

我去找这个是因为我经常想在当前目录中查找包含某个字符串的文件(然后将其打开到我当前的 VIM 中)。

这是我的快捷方式$MYVIMRC

noremap <leader>g :new<CR>:read ! grep -rn "

有了这个,当我按下时,\g我会在拆分窗口中创建一个新缓冲区并找到

:read ! grep -rn "

坐在指挥区等我。现在我只需输入我的搜索字符串,关闭双引号并点击<Enter>,然后缓冲区将填充命令输出。

完成后,一个简单的

:bw!

在那个新缓冲区中会杀死它。

于 2014-11-06T14:32:41.133 回答
0

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

:botr pedit +:setl\ autoread /tmp/out.log

现在只需运行您的命令,并将输出发送到文件。

:!date > /tmp/out.log 2>&1

命令的结果应该出现在预览窗口中。

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

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

我以为只<CR>需要两个,但后来发现自己需要三个。

于 2016-07-14T19:52:27.937 回答