用于切换colorschemes的vim函数

时间:2011-06-04 22:27:16

标签: vim

目前我正在使用两个不同的键来设置colorscheme

map <F8> :colors wombat256 <cr>
map <F9> :colors dimtag <cr>


我想实现像这样的切换行为

function! ToggleDimTags()
if (g:colors_name == "wombat256")
  colors dimtag
else
  colors wombat256
endif
endfunction

我的问题是ToogleDimTags()正在将光标位置重置为每次调用的第一行,这是不可取的。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:8)

正如评论中所讨论的,问题是您的地图正在调用:execute 行为略有不同,你可能想要的是:call而不是:

nnoremap <F5> :call ToggleDimTags()

为了澄清@ZyX的说法,:h :exec包含以下文字:

                                                         :exe   :execute 
:exe[cute] {expr1} ..   Executes the string that results from the evaluation
                        of {expr1} as an Ex command.
                        [...]

那么:execute真正做的是评估表达式寻找字符串 它将作为Ex命令执行(也称为冒号命令)。换句话说:

exec ToggleDimTags() | " <-- ToggleDimTags() is evaluated and returns 0
exec 0

这是:

:0

现在,:h :call

                                                 :cal   :call   E107   E117 
:[range]cal[l] {name}([arguments])
                Call a function.  The name of the function and its arguments
                are as specified with |:function|.  Up to 20 arguments can be
                used.  **The returned value is discarded**.
                [...]

更新

我一直在考虑你的功能,并使用三元运算符和一点点 :execute魔法,你可以将它简化到你丢弃额外的点 功能:

nnoremap <silent> <F9> :exec "color " .
    \ ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")<CR>

此处, nnoremap 不会产生输出(<silent>)并且基于 :exec,后跟此表达式:

"color " . ((g:colors_name == "wombat256") ? "dimtag" : "wombat256")

g:colors_name设置为wombat256时,表达式的计算结果为:

"color dimtag"

或者,否则:

"color wombat256"

然后由:exec评估任何一个。当然你可以加入这些台词 (不要忘记删除反斜杠),我这样做只是为了避免 一条太长的路线。