How to handle my vim local variable(omnifunc, ...), it is not set as i wrote in vimrc

Viewed 966

I use omnicomplete in VIM and my vimrc is like below.

snipping...

" Autocompletion
set completeopt=longest,noselect,menuone
set omnifunc=syntaxcomplete#Complete
autocmd FileType py set omnifunc=python3complete#Complete

But, when I restart vim. omnifunc doesn't work as i set, even value is different from my vimrc settings

I thought my restoring option was problem. However, block below settings.

" Save and load former states
"autocmd BufWinLeave ?* mkview
"autocmd BufWinEnter ?* silent loadview

It still doesn't work... How can I resolve it? Appreciate all your help.

EDIT on 2017.11.08 > Here is my full .vimrc file

syntax on 
set nocp        " no compatibility with VI
set nu          " line number
set cursorline  " highlight current cursorline
set ruler       " display cursor position information at status line
set ic          " case insensitive search
set smartcase   " don't use ic when there is Capital letter
set hlsearch    " hilight search
set incsearch   " show search matches as type
set mouse=a     " enalbe cursor move with mouse
set ts=4        " size of \t character (tab stop)
set sw=4        " tab size, when use <<, >>
set sts=4       " how many spaces, when type tab (soft tab stop)
set ls=2        " last window's status line option
set expandtab smarttab
set autowrite   " Automatically :write before running commands
set autoread    " Auto read when a file is changed on disk
set autoindent
set smartindent
set cindent
set vb noeb     " visual bell instead of beep
set tm=500 ttm=0    " to leave insert mode without delay
set encoding=utf8

" Autocompletion
set completeopt=longest,noselect,menuone
set omnifunc=syntaxcomplete#Complete
autocmd FileType py set omnifunc=python3complete#Complete

" Cursor shape
let &t_SI = "\e[5 q"    " Start Insert mode
let &t_EI = "\e[0 q"    " End Insert mode

" Key mapping
nnoremap <F2>    :!ctags -R -I --languages=C,C++ --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
nnoremap <F3>    :NERDTreeToggle<CR>
nnoremap <F4>    :TlistToggle<CR>
nnoremap <F5>    <C-w>=
nnoremap Y  y$
nnoremap n  nzz
nnoremap N  Nzz
nnoremap *  *zz
nnoremap #  #zz
inoremap <C-h>  <Left>
inoremap <C-j>  <Down>
inoremap <C-k>  <Up>
inoremap <C-l>  <Right>
inoremap <C-b>  <C-Left>
inoremap <C-f>  <C-Right>
inoremap <C-a>  <Esc>I
inoremap <C-e>  <End>
inoremap <C-@>  <C-x><C-o>
autocmd FileType c,h,cpp,hpp inoremap {<ENTER>      {}<Left><ENTER><ENTER><UP><TAB>

" Save and load former states
autocmd BufWinLeave ?* mkview
autocmd BufWinEnter ?* silent loadview

" C/C++ header
function! s:header()
    let name = "__".toupper(substitute(expand("%:t"), "\\.", "_", "g"))."__"
    exe "norm! i#ifndef ". name "\n#define ". name "\n\n\n\n#endif\t//". name "\ekk"
endfunction
autocmd BufNewFile *.{h,hpp} call <SID>header()

" Python header
function! s:py_init()
    exe "norm! i\n\n\ndef main():\npass\n\n\eIif __name__ == \"__main__\":\n\tmain()\n\egg"
endfunction
autocmd BufNewFile *.py call <SID>py_init()


" Plugin settings using Vundle
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'tpope/vim-fugitive'
Plugin 'scrooloose/nerdtree'
Plugin 'taglist-plus'
Plugin 'nanotech/jellybeans.vim'

call vundle#end()
filetype plugin indent on

" airline settings
set laststatus=2
let g:airline#extensions#tabline#enabled=1    " turn on buffer list
let g:airline_theme='murmur'
let g:airline_powerline_fonts=1
let g:airline#extensions#branch#enabled=1

" NERDTree settings 
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
let g:NERDTreeDirArrowExpandable='+'
let g:NERDTreeDirArrowCollapsible='~'

" taglist settings
let Tlist_Use_Right_Window=1

" Color settings with bundle theme (type help highlight in order to see color list)
if has("gui_running")
    colo industry   " industry, torte, koehler
else
    colo slate      " slate, koehler, ron, elflord, pablo
endif
colo jellybeans
highlight linenr        ctermfg=brown ctermbg=NONE
highlight cursorlinenr  ctermfg=green ctermbg=NONE
highlight cursorline    cterm=underline
1 Answers

You can find out where an option was last set via

:verbose set omnifunc?

It looks like your problem is caused by a wrong filetype in your :autocmd. Though Python files usually have a *.py extension, the filetype in Vim is named python. So, this should work:

autocmd FileType python set omnifunc=python3complete#Complete

Additional critique

  • I would recommend putting the settings and mappings into ~/.vim/after/ftplugin/python.vim instead of defining lots of :autocmd FileType python; it's cleaner and scales better; requires that you have :filetype plugin on, though.
  • By using :set, the value of 'omnifunc' will be inherited by other buffers that are opened from a Python one (e.g. via :new). Usually, this is not what you want. Use :setlocal omnifunc=... instead.
Related