繁体   English   中英

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

[英]How can I show COMMAND mode in statusline when entering command-line mode ( “ : ” ) on VIM?

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

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

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

注意:我知道我有“set noshowmode”,但我已经做了“set showmode”,但它没有用。 我只做了“设置 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 的 rest。 您可能希望在其中更改一些内容。 例如:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM