如何在调用自定义VIM(Python)函数后向VIM状态行发送状态

2 投票
2 回答
1626 浏览
提问于 2025-04-15 16:32

我刚刚写了我的第一个VIM脚本,使用的是Python。这是一个简单的脚本,可以在一个目录(/vim/etc/colors)中切换颜色方案。我想知道如何在颜色方案更改后,把选中的颜色方案的名字发送到VIM的状态栏。

rson给了我一个答案,这里有一个更新过的(并且调试过的)版本,供有兴趣的人参考(根据我的测试,运行得很好)

我实现了AI和Caleb的一些建议,谢谢!:

" toggleColorScheme 0.9 (l) 2009 by Jasper Poppe <jpoppe@ebay.com>

" cycle through colorschemes with F8 and Shift+F8
nnoremap <silent><F8> :call ToggleColorScheme("1")<CR>
nnoremap <silent><s-F8> :call ToggleColorScheme("-1")<CR>

" set directory with color schemes to cycle through
let g:Toggle_Color_Scheme_Path = "/etc/vim/colors"


function! ToggleColorScheme(paramater)
python << endpython
import vim
import os

paramater = (vim.eval('a:paramater'))
scheme_path = vim.eval('g:Toggle_Color_Scheme_Path')

colorschemes = [color.split('.')[0] for color in os.listdir(scheme_path) if color.endswith('.vim')]
colorschemes.sort()

if not vars().has_key('position'):
    start_scheme = vim.eval('g:colors_name') + '.vim'
    if start_scheme in colorschemes:
        position = colorschemes.index(start_scheme)
    else:
        position = 0

position += int(paramater)
position %= len(colorschemes)

vim.command('colorscheme %s' % colorschemes[position])
vim.command('redraw | echo "%s"' % colorschemes[position])
vim.command('return 1')
endpython
endfunction

2 个回答

1

既然你在这里更新脚本,

那么可以用下面的方式替代

if argument == 'next':
    position += 1
    if position == len(colorschemes) - 1:
        position = 0
elif argument == 'prev':
    position -= 1
    if position == -1:
        position = len(colorschemes) - 1

也许可以试试

scroll['next'] = +1
scroll['prev'] = -1
position += scroll[argument]
position = position % len(colorschemes) 
5

vim.command('redraw | echo "%s"' % colorschemes[position])

来自 :help echo:

后面的重绘可能会让消息再次消失。因为 Vim 通常会把重绘的工作推迟到完成一系列命令之后,所以这种情况发生得很频繁。为了避免在执行 :echo 之前的命令导致之后的重绘(重绘通常会等你输入东西后才进行),可以用 :redraw 命令强制重绘。举个例子:

:new | redraw | echo "有一个新窗口"

撰写回答