【问题标题】:setting filetype with reference/variable in vim在 vim 中使用引用/变量设置文件类型
【发布时间】:2020-08-06 23:42:51
【问题描述】:

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

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

这是我最近的尝试:

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

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

我怎样才能让它工作?

【问题讨论】:

    标签: vim command


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您的精彩回答!只需清除一件事 - 设置后的反斜杠是否意味着调用缓冲区 [space] ?
    • @prophet-5 见:h +cmd
    【解决方案2】:

    您可以使用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>
    

    【讨论】:

      猜你喜欢
      • 2011-08-09
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2021-12-25
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多