Vim 根据文件内容自动执行命令

发布于 2024-08-22 23:19:16 字数 187 浏览 6 评论 0原文

我正在尝试设置 Vim 来检测 .tex 文件何时包含命令 '\usepackage{sagemath}',并相应地运行命令。我已经做到了,

:au BufReadPost,BufWritePost *.tex TTarget sagepdf

但这会触发所有 .tex 文件,这不是我想要的。

I'm trying to set up Vim to detect when a .tex file contains the command '\usepackage{sagemath}', and run a command accordingly. I've gotten to

:au BufReadPost,BufWritePost *.tex TTarget sagepdf

but that will fire for all .tex files, which isn't what I want.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

尸血腥色 2024-08-29 23:19:16

我的 filetype.vim 中有一个关于如何区分 html 类型的示例。您可以轻松修改以适合您的逻辑。注意 getline(n) =~ 行

" HTML (.shtml and .stm for server side)
au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call s:FThtml()

" Distinguish between HTML, XHTML and Django
fun! s:FThtml()
  let n = 1
  while n < 10 && n < line("$")
    if getline(n) =~ '\<DTD\s\+XHTML\s'
      setf xhtml
      return
    endif
    if getline(n) =~ '{%\s*\(extends\|block\)\>'
      setf html.django_template
"      setf htmldjango
      return
    endif
    let n = n + 1
  endwhile
  setf html
endfun

Theres an example in my filetype.vim on how to destinguish html types. You can easily modify to suit your logic. Note the getline(n) =~ lines

" HTML (.shtml and .stm for server side)
au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm  call s:FThtml()

" Distinguish between HTML, XHTML and Django
fun! s:FThtml()
  let n = 1
  while n < 10 && n < line("$")
    if getline(n) =~ '\<DTD\s\+XHTML\s'
      setf xhtml
      return
    endif
    if getline(n) =~ '{%\s*\(extends\|block\)\>'
      setf html.django_template
"      setf htmldjango
      return
    endif
    let n = n + 1
  endwhile
  setf html
endfun
○愚か者の日 2024-08-29 23:19:16

首先,您应该考虑使用 modeline

如果您无法通过模型行获得所需的内容,您可以在 autocmd 中使用您自己的函数,如下所示:

function! MyFunction()
  ...
endfunction

autocmd BufReadPost,BufWritePost *.tex call MyFunction()

并且您可能可以编写一个函数来检查某个模式是否匹配,然后运行任何你想要的。

First, you should consider using a modeline.

If you can't get what you want with a modeline, you can use your own function in autocmd, like this:

function! MyFunction()
  ...
endfunction

autocmd BufReadPost,BufWritePost *.tex call MyFunction()

and you probably can write a function that checks whether a certain pattern matches, and then runs whatever you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文