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程序执行的新窗口,类似于cwindow_Vim_Execution - Fatal编程技术网

Vim程序执行的新窗口,类似于cwindow

Vim程序执行的新窗口,类似于cwindow,vim,execution,Vim,Execution,我正在使用Vim编辑/编译单个cpp文件makepgr=g++\-g\%,并希望理想地使用F6这样的快捷键执行生成的二进制文件。然后,所需的行为是打开一个新窗口,类似于:cwindow,具有固定的最大高度(比如20行),其中包含程序输出。我也希望能够关闭这个窗口再次与另一个快捷键如F7 作为奖励,最好在windows标题/状态中显示程序的执行时间 编辑:我所说的二进制文件是非交互式的!他们通常读取一些输入文件,进行数据操作,将结果写入其他文件,并在执行此操作时有一些输出。我不确定这是否有任何帮助

我正在使用Vim编辑/编译单个cpp文件makepgr=g++\-g\%,并希望理想地使用F6这样的快捷键执行生成的二进制文件。然后,所需的行为是打开一个新窗口,类似于:cwindow,具有固定的最大高度(比如20行),其中包含程序输出。我也希望能够关闭这个窗口再次与另一个快捷键如F7

作为奖励,最好在windows标题/状态中显示程序的执行时间


编辑:我所说的二进制文件是非交互式的!他们通常读取一些输入文件,进行数据操作,将结果写入其他文件,并在执行此操作时有一些输出。

我不确定这是否有任何帮助,因为您正在询问有关vim的信息:

我对如何解决这个问题的第一个想法是使用GNU屏幕。原因不是vim不能做到这一点,而是vim不能完全用作终端仿真器,所以运行一些交互式程序不起作用。Plus屏幕相对容易配置


当然,我会为该任务编写一个专门的屏幕配置。

我不确定这是否有任何帮助,因为您正在询问vim:

我对如何解决这个问题的第一个想法是使用GNU屏幕。原因不是vim不能做到这一点,而是vim不能完全用作终端仿真器,所以运行一些交互式程序不起作用。Plus屏幕相对容易配置


当然,我会为该任务编写一个专门的屏幕配置。

您可以将输入重定向到quickfix窗口,类似于:make works: :cex systemexpand%:r..exe

您可以使用:colder和:cnewer浏览快速修复历史记录


我意识到这并不完全是您想要的,但希望它足够有用。

您可以将输入重定向到quickfix窗口,类似于:make works: :cex systemexpand%:r..exe

您可以使用:colder和:cnewer浏览快速修复历史记录

我意识到这并不完全是您想要的,但希望它足够有用。

添加到vimrc:

 map <F6> :tabnew<CR>:.!ls -la<CR>
您甚至可以为该选项卡命名:

 map <F6> :tabnew myprog<CR>:.!./myprog<CR>
用您喜欢的任何其他数字替换5。还加

 map <F7> :tabclose<CR>
可以通过按F7关闭选项卡

另外,您可以将硬编码的myprog名称替换为expand%:r..exe for Windows,或者如前所述,仅扩展%:r for*nix。

添加到vimrc:

 map <F6> :tabnew<CR>:.!ls -la<CR>
您甚至可以为该选项卡命名:

 map <F6> :tabnew myprog<CR>:.!./myprog<CR>
用您喜欢的任何其他数字替换5。还加

 map <F7> :tabclose<CR>
可以通过按F7关闭选项卡


另外,您可以将硬编码的myprog名称替换为expand%:r..exe for Windows,也可以像前面所说的那样将%:r for*nix展开。

这个小脚本应该可以实现以下功能:

let s:title="ProgramOutput"

function! Open_output_window()
    let winnr = bufwinnr(s:title)
    if winnr != -1
        exe winnr . 'wincmd w'
        return
    endif

    let bufnr = bufnr(s:title)
    if(bufnr == -1)
        let wcmd = s:title
    else
        let wcmd = '+buffer' . bufnr
    endif

    exe 'silent! botright vertical 80 split ' .wcmd

    silent! setlocal buftype=nofile
    silent! setlocal noswapfile
    silent! setlocal nobuflisted
endfunction

function! Close_output_window()
    let winnr = bufwinnr(s:title)
    if winnr != -1
        exe winnr . 'wincmd w'
        close
    endif
endfunction

nmap <F6> <ESC>:call Open_output_window()<CR>:r ! %:r.exe<CR>
nmap <F5> <ESC>:call Close_output_window()<CR>
这些代码大部分来自taglist.vim插件——理解起来相当简单。
您可以修改窗口大小首选项的“拆分”命令。

这个小脚本应该可以实现以下功能:

let s:title="ProgramOutput"

function! Open_output_window()
    let winnr = bufwinnr(s:title)
    if winnr != -1
        exe winnr . 'wincmd w'
        return
    endif

    let bufnr = bufnr(s:title)
    if(bufnr == -1)
        let wcmd = s:title
    else
        let wcmd = '+buffer' . bufnr
    endif

    exe 'silent! botright vertical 80 split ' .wcmd

    silent! setlocal buftype=nofile
    silent! setlocal noswapfile
    silent! setlocal nobuflisted
endfunction

function! Close_output_window()
    let winnr = bufwinnr(s:title)
    if winnr != -1
        exe winnr . 'wincmd w'
        close
    endif
endfunction

nmap <F6> <ESC>:call Open_output_window()<CR>:r ! %:r.exe<CR>
nmap <F5> <ESC>:call Close_output_window()<CR>
这些代码大部分来自taglist.vim插件——理解起来相当简单。
您可以修改窗口大小首选项的拆分命令。

这当然是可行的。然而,我希望避免在vim和其他一些程序/控制台之间切换,即使在屏幕上也是如此。当然,这是一种可行的方法。然而,我希望避免在vim和其他一些程序/控制台(甚至在屏幕上)之间切换。是否可能有类似于quickfix窗口的其他命名窗口,我可以将输出重定向到这些窗口?是否可能有类似于quickfix窗口的其他命名窗口,我可以将输出重定向到这些窗口?这是一个好的开始。当我按照您的描述运行F6时,它将始终打开一个新窗口,而不是刷新旧窗口。这个问题能解决吗?另外:“拆分”案例的F7替代方案是什么?这是一个良好的开端。当我按照您的描述运行F6时,它将始终打开一个新窗口,而不是刷新旧窗口。这个问题能解决吗?另外:“拆分”案例的F7替代方案是什么?太好了,谢谢!不过有一件小事:如何在执行二进制文件之前刷新缓冲区/窗口,以便多次点击F6只会给出一个输出将nmap更改为nmap:call Open\u output\u windowggdG:r!%:r、 exe会成功的。太好了,谢谢!不过有一件小事:如何在执行二进制文件之前刷新缓冲区/窗口,以便多次点击F6只会给出一个输出将nmap更改为nmap:call Open\u output\u windowggdG:r!%:r、 exe可以做到这一点。