当前位置: 首页 > 工具软件 > vim-ft-go > 使用案例 >

搭建嵌入式开发的vim环境【3】vim键位映射和插件的使用

龙佐
2023-12-01

vim mapping机制

各种map命令作用的模式

命令模式
mapnormal,visual and Operator-pending
vmapVisual
nmapNormal
omapOperator-pending
map!Insert and Command-line
imapInsert
cmapCommand-line

vim中的各个模式

官方文档描述在这里

模式描述
normal执行vim命令以及按了esc之后进入该模式,也被称为命令模式
visual按v进入该模式
Insert按i进入该模式
operator-pending这类似于普通模式,但是在操作员命令启动后,Vim正在等待{motion}指定操作员将要处理的文本。
Command-line在命令行模式(也称为Cmdline模式)下,您可以在窗口底部输入一行文本。 这用于Ex命令“:”,模式搜索命令“?”。 和“ /”,以及过滤器命令“!”。

例子

"normal模式下,按下F2会在最后一行下面附加一个时间
map <F2> GoDate: <Esc>:read !date<CR>kJ
”insert模式下,按下F2会在光标的后面插入一个回车和时间
:imap <F2> <CR>Date: <Esc>:read !date<CR>kJ

查看当前的map关系

在vim中执行:map命令,可以查看当前配置的map关系

重映射

命令模式
noremapnormal,visual and Operator-pending
vnoremapVisual
nnoremapNormal
onoremapOperator-pending
noremap!Insert and Command-line
inoremapInsert
cnoremapCommand-line

例子

  1. 在上面的例子中对F2的映射可以修改为

    map <F2> G<F3>
    imap <F2> <Esc><F3>
    map <F3>  oDate: <Esc>:read !date<CR>kJ
    
  2. 假设您几乎从未使用过Ex模式,并且想使用“ Q”命令来设置文本格式(在旧版本的Vim中是如此)。 这个映射可以做到::map Q gq

    但是,在极少数情况下,您仍然需要使用Ex模式。 让我们将“ gQ”映射到Q,以便仍然可以进入Ex模式::map gQ Q

    现在发生的是,当您键入“ gQ”时,它将映射到“ Q”。 到目前为止,一切都很好。 但是随后“ Q”映射到“ gq”,因此键入“ gQ”将导致“ gq”,并且您根本不会进入Ex模式。

    为了避免再次映射键,请使用“:noremap”命令:noremap gQ Q

特殊字符

命令描述
<S-...>shift-keyshift <S-
<C-...>control-keycontrol ctrl <C-
<M-...>alt-key or meta-keymeta alt <M-
<A-...>same as <M-...><A-
<leader>前缀符默认是\,可以配置

插件的安装和使用

下面的内容可以配合这篇提到基本配置一起使用,主要安装了以下插件

  1. 使用vim-plug管理插件(需要在github上下载)
  2. 在vim中使能了gtags(依赖global)
  3. 使用vim-gutentags,和gutentags管理和连接gtags生成的数据库(依赖global)
  4. 使用nerdtree作为查看文件目录结构的插件
  5. 使用tagbar作为查看函数列表的插件(依赖ctags)
  6. 使用vim-airline和vim-airline-themes修改vim的状态栏
  7. 使用leaderF作为代码搜索跳转的插件,依赖gtags、ctags和vim8.2版本

升级到vim8.2版本的方法

sudo add-apt-repository ppa:jonathonf/vim
sudo apt update
sudo apt install vim

关于字符的映射自己设置吧。

"plugin gtags
let GtagsCscope_Auto_Load = 1 
let CtagsCscope_Auto_Map = 1 
let GtagsCscope_Quiet = 1 

call plug#begin('~/.vim/plugged')

Plug 'preservim/nerdtree'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'majutsushi/tagbar'
"Plug 'ludovicchabant/vim-gutentags'
"Plug 'skywind3000/gutentags_plus'
Plug 'Yggdroot/LeaderF'
call plug#end()

"configure NERDTree
map <F2> :NERDTreeToggle<CR>

"configure tagbar
nmap <F3> :TagbarToggle<CR> 

"configure airline
"Automatically displays all buffers when there's only one tab open
let g:airline#extensions#tabline#enabled = 1 
let g:airline#extensions#tabline#formatter = 'unique_tail'
let g:airline_theme='solarized'
let g:airline_solarized_bg='dark'

"configure gutentags
let g:gutentags_ctags_tagfile = '.tags'
" enable gtags module
let g:gutentags_modules = []
if executable('ctags')
    let g:gutentags_modules += ['ctags']
endif
if executable('gtags-cscope') && executable('gtags')
    let g:gutentags_modules += ['gtags_cscope']
endif

" config project root markers.
let g:gutentags_project_root = ['.root','.git']

" generate datebases in my cache directory, prevent gtags files polluting my project
let g:gutentags_cache_dir = expand('~/.cache/tags')

" forbid gutentags adding gtags databases
let g:gutentags_auto_add_gtags_cscope = 0 

"map gtags
" don't show the help in normal mode
let g:Lf_HideHelp = 1 
let g:Lf_UseCache = 0 
let g:Lf_UseVersionControlTool = 0 
let g:Lf_IgnoreCurrentBufferName = 1 
" popup mode
"let g:Lf_WindowPosition = 'popup'
"let g:Lf_PreviewInPopup = 1
"let g:Lf_StlSeparator = { 'left': "\ue0b0", 'right': "\ue0b2", 'font': "DejaVu Sans Mono for Powerline" }
"let g:Lf_PreviewResult = {'Function': 0, 'BufTag': 0 }

let g:Lf_ShortcutF = "<leader>ff"
noremap <leader>fb :<C-U><C-R>=printf("Leaderf buffer %s", "")<CR><CR>
noremap <leader>fm :<C-U><C-R>=printf("Leaderf mru %s", "")<CR><CR>
noremap <leader>ft :<C-U><C-R>=printf("Leaderf bufTag %s", "")<CR><CR>
noremap <leader>fl :<C-U><C-R>=printf("Leaderf line %s", "")<CR><CR>

noremap <C-B> :<C-U><C-R>=printf("Leaderf! rg --current-buffer -e %s ", expand("<cword>"))<CR>
noremap <C-F> :<C-U><C-R>=printf("Leaderf! rg -e %s ", expand("<cword>"))<CR>
" search visually selected text literally
xnoremap gf :<C-U><C-R>=printf("Leaderf! rg -F -e %s ", leaderf#Rg#visual())<CR>
noremap go :<C-U>Leaderf! rg --recall<CR>

" should use `Leaderf gtags --update` first
let g:Lf_GtagsAutoGenerate = 0 
let g:Lf_Gtagslabel = 'native-pygments'
noremap <leader>fr :<C-U><C-R>=printf("Leaderf! gtags -r %s --auto-jump", expand("<cword>"))<CR><CR>
noremap <leader>fd :<C-U><C-R>=printf("Leaderf! gtags -d %s --auto-jump", expand("<cword>"))<CR><CR>
noremap <leader>fo :<C-U><C-R>=printf("Leaderf! gtags --recall %s", "")<CR><CR>
noremap <leader>fn :<C-U><C-R>=printf("Leaderf gtags --next %s", "")<CR><CR>
noremap <leader>fp :<C-U><C-R>=printf("Leaderf gtags --previous %s", "")<CR><CR>

 类似资料: