在 vim 中使用 reference/variable 设置文件类型

setting filetype with reference/variable in vim

我正在尝试改进 neovim 帮助中显示缓冲区和原始文件之间差异的命令。

问题是新缓冲区打开时没有语法突出显示,因为它没有文件类型。 所以我尝试将文件类型保存到变量和寄存器中,但我稍后无法在 setf 命令中使用它(甚至手动)

这是我最近的尝试:

command! DiffOrig call setreg('f', &filetype) | vert new | set buftype=nofile | read ++edit # | 0d_
    \ | diffthis | setf @f | wincmd p | diffthis

在这次尝试中,我设法保存了要注册的原始文件类型,但我没有设法将其用作 setf 的参数。

我怎样才能让它发挥作用?

您可以使用 let: let &ft=@f 来完成此操作。 :setf 只接受文字字符串。

这在函数中也可能更整洁,您可以在其中使用局部变量而不是寄存器。如果你想这样做,你可以定义一个私有函数,方法是在函数名前加上 s: 前缀,然后用 <SID> 引用它。所以像这样:

function! s:DoDiffOrig()
  let oldft=&ft
  " ...
  let &ft=oldft
  wincmd p
  diffthis
endfunction

command! DiffOrig call <SID>DoDiffOrig()<CR>

VimScript 在“命令”和“表达式”(包括“变量”)之间设置了很大的区别。只有少数命令接受表达式,而其他命令,如 setsetfiletype,只接受字符串。这就是为什么人们必须如此频繁地使用 execute 的原因。然而在这种情况下,简单的 let 就足够了。这是 DiffOrig 的完整实现,设置了 filetype

command! -bar DiffOrig
    \   vnew +setlocal\ buftype=nofile
    \ | let &filetype = getbufvar(0, '&filetype')
    \ | read ++edit #
    \ | 1delete_
    \ | diffthis
    \ | wincmd p
    \ | diffthis