在vim中切换功能

时间:2013-12-14 02:49:08

标签: function vim

基本上我想做的是

map ,e :call ToggleEssayMode()<CR>
function! ToggleEssayMode()
if toggle==true
  :map j gj
  :map k gk
  toggle=false
else
  :umap j
  :umap k
  toggle=true
enndfunction

我已经看了一会儿,但我能找到的人都使用保留的vim变量。我可以制作自己的变量吗?有没有更正确的方法呢?

3 个答案:

答案 0 :(得分:6)

除非你使用单独的函数来启用和禁用,否则你需要一个标志变量,为了将其与其他配置隔离开来,我建议你写一个小插件。例如,使用以下内容在essay.vim中创建文件.vim(实际名称无关,只要它在~/.vim/plugin/中结束):

let s:enabled = 0

function! ToggleEssayMode()
    if s:enabled
        unmap j
        unmap k
        let s:enabled = 0
    else
        nnoremap j gj
        nnoremap k gk
        let s:enabled = 1
    endif
endfunction

调用ToggleEssayMode()的映射可以位于同一文件中,也可以位于.vimrc

关于您的代码的一些评论:

  • 使用let分配变量(参见set选项)。
  • Vim不支持truefalse;请改用10
  • 每个if都需要关闭endif
  • umap应为unmap;前者不存在。
  • 应该使用
  • nnoremap以避免递归映射。
  • 在脚本中的命令之前,
  • :是不必要的。

答案 1 :(得分:1)

Nikita Kouevda的答案帮助我将其拼凑起来,但是我仍然需要仔细检查一些内容。为了后代,这再次是脚本:

let s:enabled = 0

function! ToggleEssayMode()
    if s:enabled
        unmap j
        unmap k
        let s:enabled = 0
    else
        nnoremap j gj
        nnoremap k gk
        let s:enabled = 1
    endif
endfunction

s:的{​​{1}}部分表明它是一个变量。如果您只是做s:enabled,然后再做let enabled = 0,它将在if enabled上出错。

该函数需要以大写字母开头,由于某种原因,vim会强制执行。当我自定义功能时,遇到了这个要求。

要稍后调用您的函数,您需要使用if。例如,:call

我只是将其放置在:call ToggleEssayMode()中,而不是插件文件夹中。

最后一个提示:使用.vimrc重新加载:so %,而无需重新启动vim。可能会因已定义的内容而产生许多错误,但仍然可以正常工作。

答案 2 :(得分:0)

我只是提供了一个较短的:

let s:_toggle=0
function! s:toggleFunc() abort
    let s:_toggle = s:_toggle? 0: 1
    return s:_toggle
endfunction

屏幕截图(可点击):