Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim符号列切换_Vim - Fatal编程技术网

Vim符号列切换

Vim符号列切换,vim,Vim,在Vim中定义符号时,屏幕左侧会出现一列 从Vim帮助中: 为文件定义符号时,Vim将自动添加两列 要在中显示它们的字符。当最后一个符号未放置时,列 又消失了 是否可以在仍定义符号的情况下删除该列? 理想情况下,我希望打开/关闭该列。好吧,您可以区分已定义的(描述某个标志的外观)和已放置的标志(实际显示在标志列中) 不幸的是,没有方法可以在不首先移除所有放置的标志的情况下切换标志列。因此,您必须使用list/dict来保存符号的ID/行号 (无耻插头:)更新,因为您可以使用“signcolumn

在Vim中定义符号时,屏幕左侧会出现一列

从Vim帮助中:

为文件定义符号时,Vim将自动添加两列
要在中显示它们的字符。当最后一个符号未放置时,列
又消失了

是否可以在仍定义符号的情况下删除该列?


理想情况下,我希望打开/关闭该列。

好吧,您可以区分已定义的(描述某个标志的外观)和已放置的标志(实际显示在标志列中)

不幸的是,没有方法可以在不首先移除所有放置的标志的情况下切换标志列。因此,您必须使用list/dict来保存符号的ID/行号


(无耻插头:)

更新,因为您可以使用“signcolumn”选项禁用显示标志。请看一下文档

嗯,您需要取消当前缓冲区的所有标志的放置,以使其不显示。对于最新的Vims(例如比e 7.3.596更新的Vims),您只需使用
:sign unplace*

你可以使用我的插件将这些标志保存到一个临时文件中(实际上,该文件将创建一个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

如果您愿意等待Bram在他的待办事项列表中找到它,或者愿意自己修补/编译Vim,则最近提交了一个修补程序,允许使用新的“signcolumn”选项进行此操作。

如果您使用的是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

基于@elliottcable的回答(非常感谢!),我编写了一个简单的切换函数,并将其映射到
2

nnoremap 2:call-ToggleSignColumn()
“切换符号列。适用于vim>=8.1或NeoVim
函数!ToggleSignColumn()
如果!存在(“b:signcolumn_on”)| b:signcolumn_on
set signcolumn=no
设b:signcolumn_on=0
其他的
设置signcolumn=number
设b:signcolumn_on=1
恩迪夫
端功能
或者,如果还要切换线号,只需修改映射线:

nnoremap <Leader>2 :set number!<CR>:call ToggleSignColumn()<CR>
nnoremap 2:设置编号!:调用ToggleSignColumn()

希望有帮助:)

我想你只能用sign unplace来删除它们
:sign unplace*
将它们全部删除。现在有一种比接受答案更好的方法可以做到这一点–请参阅。我不一定需要永久存储符号。更多的是用于可能来自代码检查程序或其他可以轻松重新生成的东西的符号,但不是不要像切换某个东西那样快。然后只要调用
sign unplace*
,并在需要时替换这些符号就足够了。这就是我倾向于的。检查大量代码可能需要~5秒,但我想这是一个微不足道的烦恼。这实际上可能需要很长时间,直到包括在内。我仍然有太多的补丁待办事项列表;(感谢您使用此列表。对于那些也使用相对编号的人,我们还可以添加切换
set relativeEnumber!
这是一个非常有用的概念,但我需要将
set signcolumn=auto
更改为
set signcolumn=yes
,以使其在我的环境中工作。
nnoremap <Leader>2 :set number!<CR>:call ToggleSignColumn()<CR>