Vim符号列切换

lokaqttq  于 2022-11-11  发布在  其他
关注(0)|答案(6)|浏览(159)

当在Vim中定义了符号时,屏幕左侧会出现一列。
从Vim帮助:
当为文件定义符号时,Vim会自动添加一列两个符号
字符来显示它们。当最后一个符号被取消时,
再次消失。

是否可以在仍有定义的标志时删除该列?

理想情况下,我希望切换列的开/关。

aiqt4smr

aiqt4smr1#

如果您使用的是Vim 8.0或更高版本(或NeoVim),现在这是一个简单的设置:

$ vim "+help signcolumn" "+only"

例如,

:set scl=no   " force the signcolumn to disappear
:set scl=yes  " force the signcolumn to appear
:set scl=auto " return the signcolumn to the default behaviour
vsikbqxv

vsikbqxv2#

更新7.4.2201补丁开始,您可以使用“signcolumn”选项来禁用显示符号。请查看文档:h“signcolumn”

你需要取消当前缓冲区的所有标志,使它们不显示出来。对于最近的Vim(例如更新的Thane 7.3.596),你可以简单地使用:sign unplace *
你可以使用我的插件https://github.com/chrisbra/SaveSigns.vim将这些标志保存到一个临时文件中(这实际上会创建一个Vim脚本,以便能够替换所有的标志。使用该插件,你可以编写一个自定义函数来切换标志的显示。
以下内容可能对您有用:

fu! MySignsToggle()
    if !has("signs") || empty(bufname(''))
        return
    endif
    if !exists("s:signfile")
        let s:signfile = tempname().'_'
    endif
    redir =>a|exe "sil sign place buffer=".bufnr('')|redir end
    let signs = split(a, "\n")[1:]
    if !empty(signs)
        let bufnr = bufnr('')
        exe ":sil SaveSigns!" s:signfile.bufnr('')
        if bufnr('') != bufnr
            exe "noa wq"
        endif
        sign unplace *
    elseif filereadable(s:signfile.bufnr(''))
        exe "so" s:signfile.bufnr('')
        call delete(s:signfile.bufnr(''))
    endif
endfu
8ehkhllq

8ehkhllq3#

基于@elliottcable的回答(非常感谢!),我编写了一个简单的toggle函数,并将其Map到<Leader>2

nnoremap <Leader>2 :call ToggleSignColumn()<CR>

" Toggle signcolumn. Works on vim>=8.1 or NeoVim
function! ToggleSignColumn()
    if !exists("b:signcolumn_on") || b:signcolumn_on
        set signcolumn=no
        let b:signcolumn_on=0
    else
        set signcolumn=number
        let b:signcolumn_on=1
    endif
endfunction

或者,如果您也想切换行号,只需修改Map行:

nnoremap <Leader>2 :set number!<CR>:call ToggleSignColumn()<CR>

希望对大家有帮助:)

abithluo

abithluo4#

如果您愿意等待Bram在他的TODO列表中找到它,或者愿意自己修补/编译Vim,最近提交了一个补丁,通过一个新的'signcolumn'选项来实现这一点。https://groups.google.com/d/topic/vim_dev/CrBId6DRbvo/discussion

klr1opcd

klr1opcd5#

好吧,你可以区分 defined(描述某个符号的样子)和 placed 符号(实际上显示在符号列中)。
不幸的是,没有办法在不删除所有符号的情况下切换符号列。因此,你必须使用列表/字典来保存符号的ID/行号。
(无耻插:(第10页)

ercv8c1e

ercv8c1e6#

Vimscript单行程序(Vim/新Vim):

exe "set signcolumn=" .. (&signcolumn == "yes" ? "no" : "yes")

Lua单行程序(Neovim):

vim.o.signcolumn = vim.o.signcolumn == "yes" and "no" or "yes"

相关问题