在 VIM 上进入命令行模式 (" : ") 时,如何在状态栏中显示命令模式?

How can I show COMMAND mode in statusline when entering command-line mode ( " : " ) on VIM?

我从 VIM 开始(是的,只是 VIM,不是 NeoVIM 或任何其他)并且我在我的 .vimrc 中配置了一个 StatusLine 并显示了我所处的当前模式并且所有模式都正确显示,除了......当我进入命令行模式(“:”)我希望状态行显示“COMMAND”并且它显示“NORMAL”(我在底部显示 StatusLine)。

我正在寻找无需安装任何插件的解决方案。我为这个问题搜索了很多,但没有找到与这个特定问题相关的任何内容......谢谢!

这里是 .vimrc(StatusLine 内容从“>>>>> 状态行”开始):

注意:我知道我已经“set noshowmode”,但我已经做了“set showmode”但它没有用。我只做了“set noshowmode”因为我不需要模式显示两次...

" ------------------   VIM Configuration   -------------------------

set nocompatible " VI compatible mode is disabled so that VIm things work
syntax on " enable syntax processing
syntax enable
set encoding=utf-8

filetype indent on " load filetype-specific indent files
filetype on
filetype plugin on " load filetype specific plugin files


" >>>>> Spaces & Tabs
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set smartindent
" ----------------------------------------------------------


" >>>>> Buffers
set hidden " Allows having hidden buffers without saving them
" ----------------------------------------------------------


" >>>>> UI Config 

set number  " show line numbers 
set colorcolumn=80  "Know where I am
highlight ColorColumn ctermbg=white
set nowrap
set scrolloff=8

set wildmenu  " visual autocomplete for command menu 

set nobackup " backup file is immediately deleted upon successfully writing the original file.
set noswapfile

let python_highlight_all=1
set omnifunc=syntaxcomplete#Complete
" ----------------------------------------------------------


" >>>>> Searching

set path+=**
set incsearch         " search as characters are entered
set ignorecase        " Ignore case in searches by default
set smartcase         " But make it case sensitive if an uppercase is entered
" ----------------------------------------------------------


" >>>>> Status line

" status bar colors
au InsertEnter * hi statusline guifg=black guibg=#d7afff ctermfg=black ctermbg=magenta
au InsertLeave * hi statusline guifg=black guibg=#8fbfdc ctermfg=black ctermbg=cyan
hi statusline guifg=black guibg=#8fbfdc ctermfg=black ctermbg=cyan

" default: set statusline=%f\ %h%w%m%r\ %=%(%l,%c%V\ %=\ %P%)

" Status Line Custom
let g:currentmode={
    \ 'n'  : 'Normal',
    \ 'no' : 'Normal·Operator Pending',
    \ 'v'  : 'Visual',
    \ 'V'  : 'V·Line',
    \ '^V' : 'V·Block',
    \ 's'  : 'Select',
    \ 'S'  : 'S·Line',
    \ '^S' : 'S·Block',
    \ 'i'  : 'Insert',
    \ 'R'  : 'Replace',
    \ 'Rv' : 'V·Replace',
    \ 'c'  : 'Command',
    \ 'cv' : 'Vim Ex',
    \ 'ce' : 'Ex',
    \ 'r'  : 'Prompt',
    \ 'rm' : 'More',
    \ 'r?' : 'Confirm',
    \ '!'  : 'Shell',
    \ 't'  : 'Terminal'
    \}

set laststatus=2
set noshowmode
set statusline=
set statusline+=%0*\ %n\                                 " Buffer number
set statusline+=%1*\ %<%F%m%r%h%w\                       " File path, modified, readonly, helpfile, preview
set statusline+=%3*│                                     " Separator
set statusline+=%2*\ %Y\                                 " FileType
set statusline+=%3*│                                     " Separator
set statusline+=%2*\ %{''.(&fenc!=''?&fenc:&enc).''}     " Encoding
set statusline+=\ (%{&ff})                               " FileFormat (dos/unix..)
set statusline+=%=                                       " Right Side
set statusline+=%2*\ col:\ %02v\                         " Column number
set statusline+=%3*│                                     " Separator
set statusline+=%1*\ ln:\ %02l/%L\ (%3p%%)\              " Line number / total lines, percentage of document
set statusline+=%0*\ %{toupper(g:currentmode[mode()])}\  " The current mode

hi User1 ctermfg=007 ctermbg=239 guibg=#4e4e4e guifg=#adadad 
hi User2 ctermfg=007 ctermbg=236 guibg=#303030 guifg=#adadad
hi User3 ctermfg=236 ctermbg=236 guibg=#303030 guifg=#303030
hi User4 ctermfg=239 ctermbg=239 guibg=#4e4e4e guifg=#4e4e4e
" ----------------------------------------------------------



" >>>>> Netrw (File Tree)

let g:netrw_banner=0        " disable annoying banner
let g:netrw_browse_split=4 " open in prior window
let g:netrw_altv=1          " open splits to the right                    
let g:netrw_liststyle=3     " tree view
let g:netrw_list_hide=netrw_gitignore#Hide()
let g:netrw_list_hide.=',\(^\|\s\s\)\zs\.\S\+'
let g:netrw_winsize = 75
" ----------------------------------------------------------

我能得到的最接近的:

autocmd CmdlineEnter * redrawstatus

一如既往,自动命令属于augroups。如果你不知道那是什么意思,那就意味着你想将以下所有内容复制并粘贴到你的 vimrc 中,而不仅仅是我给出的第一行:

augroup statusline
    autocmd!
    autocmd CmdlineEnter * redrawstatus
augroup END

请注意,这不会影响所有状态行,只会影响您在进入命令行之前所在的 window。这个答案没有经过全面测试,甚至测试时间超过 45 秒,而且我确信我忽略了一些边缘情况,或者可以通过某些方式改进这个答案。如果我想到那些,我会编辑这个。 CmdlineLeave 是否值得添加,我不确定。我确信添加 CmdlineChanged 不是一个好主意。

现在开始你的 vimrc 的其余部分。您可能想要更改其中的一些内容。例如:

  • 取出set nocompatible
  • 使用 syntax onsyntax enable,但不能同时使用。多余
  • filetype plugin indent on可以是一行,不是三行,不过我觉得没关系
  • 设置 tabstop 为 8 以外的其他设置可能会搞砸,并且几乎可以肯定地通过其他设置实现您想要的任何行为
  • smartindent 已过时,我信任的某些社区成员不再推荐
  • ** 添加到 path 很常见,但这并不意味着这是一个好主意
  • 没有hlsearch?
  • 自动命令应该在 augroups 中
  • g:currentmode中,^V^S是一两个字符吗?如果他们是两个,他们将不匹配

据我所知。我相信还有更多其他人可以推荐。如果你不想直接 runtime 它,defaults.vim 是寻找 vimrc 想法的好地方。