Vim:在拆分屏幕中执行我正在处理的脚本


Answers:



10

Vim不会,并且永远不会支持emacs或kate之类的嵌入式外壳程序(如果您要那样做的话),请参见以下stackoverflow问题

David Spillet是正确的,您可以在gnu屏幕中运行vim:

$ screen vim foo.txt

但这只会给您带来远程类似于终端机中的windowmanager的功能-在ssh或没有X的盒子上使用时非常有用,但是在本地您也可以打开另一个xterm并在它们之间切换。

无论如何,如果您可以忍受一个事实,即在查看文件生成的输出时看不到正在编辑的文件,那么Jack M的技巧很好,但可以更短:

:map ;e :w<cr>:!python %<cr>

出于相同的目的,我将其包含在~/.vimrc

au BufEnter *
\if match( getline(1) , '^\#!') == 0 |
\ execute("let b:interpreter = getline(1)[2:]") |
\endif

fun! CallInterpreter()
    if exists("b:interpreter")
         exec ("!".b:interpreter." %")
    endif
endfun

map <F5> :call CallInterpreter()<CR>

这将运行#!第一行上带有shebang()的任何文件。它使用解释器来运行文件,因此它不需要具有执行权限。

*(屏幕还具有其他一些非常简洁的功能,例如从输出中进行复制和粘贴,监视隐藏的窗口是否处于活动状态,能够同时使用来自不同终端的会话,能够退出并退出所有程序运行-这是一个功能强大的工具)。


直到我将第一行(带有\ if)与au BufEnter放在同一行之前,该自动命令才对我有用,但是我删除了\
Jason Axelson 2010年

Vim可能不支持本机外壳,但我只是想提一提这个有趣的外壳插件:vim.org/scripts/script.php?script_id=2771
MIKKEL先生

:map ;e :w<cr>:!python %<cr>想要回显我的vim缓冲区中的内容以“确认”(?)命令已运行。我如何获得它以简单方式静默执行命令?:map <silent> ...似乎不起作用。
约翰尼·犹他州

5

最不冗长的方式(要求脚本可执行)是:

 :!%

为此,我必须将其修改为:!./%在当前目录中找到该脚本。
保罗·温兹

而且,我不是专家,但似乎!告诉vim作为bash命令执行以下命令,因此您可以执行!echo "Hello"。将%展开为当前文件的名称。
保罗·温兹

2

它可能不是分屏的,但是对我来说效果很好:

map ;e :w<CR>:exe ":!python " . getreg("%") . "" <CR>

这映射;e出当前文件,并使用python执行它(假定python在您的上PATH)。





0

这个小片段在.vimrc一个按键(如执行当前文件F5),并显示结果在一个新的拆分窗格缓冲。

:! 可以,但是您需要切换到终端以查看结果。

尽管可以做到这一点ctrl-z并带回vim,fg但这仍然意味着您需要大量切换上下文。

代码段的工作方式是,首先基于来猜测可执行文件filetype,然后以当前文件作为参数运行该可执行文件。

接下来,一个方便的实用程序方法获取输出并将其转储到新缓冲区中。

它不是完美的,但对于常见的工作流程来说确实非常快。

以下是复制的片段:

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""""""""""""""""""""""" RUN CURRENT FILE """""""""""""""""""""""""""""
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Execute current file
nnoremap <F5> :call ExecuteFile()<CR>

" Will attempt to execute the current file based on the `&filetype`
" You need to manually map the filetypes you use most commonly to the
" correct shell command.
function! ExecuteFile()
  let filetype_to_command = {
  \   'javascript': 'node',
  \   'coffee': 'coffee',
  \   'python': 'python',
  \   'html': 'open',
  \   'sh': 'sh'
  \ }
  let cmd = get(filetype_to_command, &filetype, &filetype)
  call RunShellCommand(cmd." %s")
endfunction

" Enter any shell command and have the output appear in a new buffer
" For example, to word count the current file:
"
"   :Shell wc %s
"
" Thanks to: http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window
command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>)
function! RunShellCommand(cmdline)
  echo a:cmdline
  let expanded_cmdline = a:cmdline
  for part in split(a:cmdline, ' ')
     if part[0] =~ '\v[%#<]'
        let expanded_part = fnameescape(expand(part))
        let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '')
     endif
  endfor
  botright new
  setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
  call setline(1, 'You entered:    ' . a:cmdline)
  call setline(2, 'Expanded Form:  ' .expanded_cmdline)
  call setline(3,substitute(getline(2),'.','=','g'))
  execute '$read !'. expanded_cmdline
  setlocal nomodifiable
  1
endfunction

-1

我不直接了解vim,但是您通常可以使用screen实用程序以这种方式拆分屏幕。ctrl+ aS(注意,是大写的S)将分割显示,你可以在这两个具有之间进行切换ctrl+ atab(如果窗口是空的,用ctrl+ an移动到另一个打开的窗口或ctrl+ ac创建一个新的) 。

您也可以将显示分割成两个以上,并使用ctrl-a,:resize更改分割的大小。我经常以这种方式使用屏幕,尽管它不是您所要求的单键解决方案,但却非常方便。


您确定它适用于Vim吗?它似乎在我的vim中没有响应(我使用slpit命令在文件之间分割)。
亚当·马坦

这些是GNU屏幕,而不是vim命令。
innaM

是的 我说的是在屏幕上运行vim。
David Spillett

vim拆分是在vim窗口(或其运行的终端)的范围内发生的事情。
hasen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.