在 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 在“命令”和“表达式”(包括“变量”)之间设置了很大的区别。只有少数命令接受表达式,而其他命令,如 set
或 setfiletype
,只接受字符串。这就是为什么人们必须如此频繁地使用 execute
的原因。然而在这种情况下,简单的 let
就足够了。这是 DiffOrig
的完整实现,设置了 filetype
:
command! -bar DiffOrig
\ vnew +setlocal\ buftype=nofile
\ | let &filetype = getbufvar(0, '&filetype')
\ | read ++edit #
\ | 1delete_
\ | diffthis
\ | wincmd p
\ | diffthis
我正在尝试改进 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 在“命令”和“表达式”(包括“变量”)之间设置了很大的区别。只有少数命令接受表达式,而其他命令,如 set
或 setfiletype
,只接受字符串。这就是为什么人们必须如此频繁地使用 execute
的原因。然而在这种情况下,简单的 let
就足够了。这是 DiffOrig
的完整实现,设置了 filetype
:
command! -bar DiffOrig
\ vnew +setlocal\ buftype=nofile
\ | let &filetype = getbufvar(0, '&filetype')
\ | read ++edit #
\ | 1delete_
\ | diffthis
\ | wincmd p
\ | diffthis