有没有一种方法可以使用vim动态检查HTML输出?

8
当我在MacVim中编写html时,我会在网页浏览器中打开同一文件,以便检查html输出。我不喜欢这种方法的其中一个原因是我不得不经常离开vim,去到浏览器中重新加载html才能看到更新。有没有更优雅的vim解决方案,可以在输入vim时动态更新html输出?我记得Textmate可以做到这一点?谢谢。
更新: 我找到了我想要记住的视频。您可以在此处找到它:

http://files.fletcherpenney.net/TextMate-Preview.mov


你知道如何在TM中做这个吗?我记不起原始来源了。 - drbunsen
在Mac上可能的一个解决方案是 marked,它可以与多种编辑器配合使用。不幸的是,它不能实时更新。 - drbunsen
好吧,我不是 TextMate 用户 :-) 我想说的是,Vim 不是为 TextMate 用户设计的。Vim 来自另一个背景,因此,如果你真的想学习如何使用它,请学习 Vim 的方式。当你成为流利的用户时,这些事情将变得容易。我每天都看到很多用户说“我如何在 Vim 中做到这一点?TextMate 是这样做的…”,这让我很紧张。我知道,这是一种宗教战争。 - sidyll
谢谢sidyll,不用担心 - 我已经使用Vim有一段时间了。我不是想复制TM的功能;相反,我只是想找到一种使用任何选择的文本编辑器动态呈现HTML的方法。在我的特定用例中,这恰好是Vim。希望这样说得清楚。谢谢。 - drbunsen
当然可以。我已经发布了一个答案,其中包含一些帮助你的东西。我之前也有这个,它非常有用,但是不想以任何方式类似于TM :-) - sidyll
3个回答

6
将以下内容添加到您的.vimrc文件中:
" Refresh WebKit
nnoremap \r :Refresh<CR>

command! Refresh call RefreshWebKit() 

function! RefreshWebKit()
    silent !osascript -e 'tell application "WebKit"'
                    \ -e '  set p_url to URL of current tab of front window'
                    \ -e '  set URL of current tab of front window to p_url'
                    \ -e 'end tell'
endfunction

这将创建一个地图、一个命令和一个函数。我可以将它们合并,但这样更清晰,我可以在其他地方重复使用该函数。
该函数调用了一个小的AppleScript来重新设置最前面标签页的URL,从而刷新它。这将适用于Safari和WebKit,但我不能保证它能在其他浏览器中工作。如果不行,请搜索“refresh {browser} applescript”并使用其他脚本。
地图只是调用命令,命令又调用函数。因此,您可以编写您的文件并使用它来在不离开Vim的情况下刷新浏览器。同样,使用:Refresh来完成相同的操作。
请注意,您可能需要更改一些内容:
  • 地图本身,我使用了\r,请使用您感到舒适的任何内容。
  • 函数名称,如果您想避免与其他现有函数发生冲突
  • 浏览器。这里我使用的是WebKit,而不是Safari。它是WebKit本身的夜间版本。使用Chrome、Firefox或任何其他名称(带有相应的更改)
一个快速的提示:传递给程序的额外-e选项只是为了可读性。按照您想要的方式执行即可。

还可以查看自动命令(请参阅:h autocmd.txt)。这将让您以更自动化的方式完成操作,例如:

:autocmd BufWrite *.html Refresh

每次你为 .html 文件写入缓冲区时,这将调用 :Refresh。还有插入文本等事件。

@dr.bunsen,视频讲解的是Markdown,但我的答案都基于HTML文件...这就是你最初的问题,对吧? - sidyll
哇,这看起来很棒!是的,我只关心HTML,但是我链接的视频是Markdown格式的。我会尝试使用你的脚本并回报结果。谢谢! - drbunsen
谢谢,这个完美地解决了问题。虽然它不是一个动态的解决方案,但我认为在可用的选项中,这是最好的选择。 - drbunsen
很高兴能帮助@dr.bunsen。这个非常灵活,所以你最终会找到最好的用法。查看自动命令的文档,并尝试使用事件,比如将BufWrite更改为插入文本事件。 - sidyll

3

谢谢Romainl,这非常聪明!我认为它将是完美的,除了记得在发布之前删除元标记所增加的额外开销。 - drbunsen

0

我使用 (osx) kicker ruby gem,它会在文件更改时自动运行:

kicker -e "osascript -e 'tell application \"WebKit\" to do JavaScript \"window.location.reload()\" in first document'"

或者将其放入 .kick 文件中,以便更好地控制哪些文件应该触发它和/或执行更多操作:

process do |files|
  unless files.grep(/\.(html|css|js)$/).empty?
    execute("osascript -e 'tell application \"WebKit\"
      do JavaScript \"window.location.reload()\" in first document
    end tell'")
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接