在前面的章节中,我们介绍过设置Vim的一种方式。使用叹号可以快速将布尔变量设置为相反的值(set someoption!)。把常用的设置映射成快捷键会非常实用。

快速设置显示行号

Vim

1

:nnoremap <leader>N :setlocal number!<cr>

但是这只对布尔类型的设置有用。对于需要提供参数来设置的项目,就不能用这种方法进行快速设置了。

Toggle选项

在这种情况下,我们可以定义一个函数,然后将某个函数map到这个快捷键。这里用foldcolumn举例,这个设置是在左边打开/关闭代码折叠的层级的。

toggle=0 关闭

foldcolumn=4 显示4个层级

下面的代码可以快速设置foldcolumn为0或4切换。将代码复制到~/.vimrc中然后source一下。

Vim

1

2

3

4

5

6

7

8

9

nnoremap <leader>f :call FoldColumnToggle()<cr>

function! FoldColumnToggle()

    if &foldcolumn

        setlocal foldcolumn=0

    else

        setlocal foldcolumn=4

    endif

endfunction

再举一个例子,下面的代码可以快速开关quickfix窗口。

Vim

1

2

3

4

5

6

7

8

9

10

11

12

13

nnoremap <leader>q :call QuickfixToggle()<cr>

let g:quickfix_is_open = 0

function! QuickfixToggle()

    if g:quickfix_is_open

        cclose

        let g:quickfix_is_open = 0

    else

        copen

        let g:quickfix_is_open = 1

    endif

endfunction

但问题是,关闭窗口的时候会跳到最后一个窗口,我们关闭的时候跳到之前打开的窗口。可以在打开quickfix的时候记录一下是哪个窗口。

Vim

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

nnoremap <leader>q :call QuickfixToggle()<cr>

let g:quickfix_is_open = 0

function! QuickfixToggle()

    if g:quickfix_is_open

        cclose

        let g:quickfix_is_open = 0

        execute g:quickfix_return_to_window . "wincmd w"

    else

        let g:quickfix_return_to_window = winnr()

        copen

        let g:quickfix_is_open = 1

    endif

endfunction