" Включаем мышку даже в текстовом режиме " (очень удобно при копировании из терминала, т. к. без этой опции, " например, символы табуляции раскладываются в кучу пробелов). " set mouse=a " Минимальная высота окна set winminheight=0 " Минимальная ширина окна set winminwidth=0 " Всегда отображать статусную строку для каждого окна set laststatus=2 " Опции автодополнения - включаем только меню с доступными вариантами " автодополнения (также, например, для omni completion может быть " окно предварительного просмотра). set completeopt=menu " Размер табуляции set tabstop=2 " Размер сдвига при нажатии на клавиши << и >> set shiftwidth=2 " Ширина 'мягкого' таба set softtabstop=2 " Преобразовать табуляцию в пробелы set expandtab " Копирует отступ от предыдущей строки set autoindent " Включаем 'умную' автоматическую расстановку отступов set smartindent " Включаем подсветку синтаксиса syntax on " Включаем перенос строк set wrap " Перенос строк по словам, а не по буквам set linebreak " Включаем отображение выполняемой в данный момент команды в правом нижнем углу экрана. " К примеру, если вы наберете 2d, то в правом нижнем углу экрана Vim отобразит строку 2d. set showcmd " Включаем отображение дополнительной информации в статусной строке set statusline=%<%f%h%m%r%=format=%{&fileformat}\ file=%{&fileencoding}\ enc=%{&encoding}\ %b\ 0x%B\ %l,%c%V\ %P " Включаем подсветку выражения, которое ищется в тексте set hlsearch " При поиске перескакивать на найденный текст в процессе набора строки set incsearch " Останавливать поиск при достижении конца файла set nowrapscan " Игнорировать регистр букв при поиске set ignorecase " Отключаем создание бэкапов set nobackup " Отключаем создание swap файлов set noswapfile "" Все swap файлы будут помещаться в эту папку "set dir=~/.vim/swp "" Размер истории для отмены "set undolevels=1000 " Список кодировок файлов для автоопределения set fileencodings=utf-8,cp1251,koi8-r,cp866 " Включает виртуальный звонок (моргает, а не бибикает при ошибках) set visualbell " Перемещать курсор на следующую строку при нажатии на клавиши вправо-влево и пр. set whichwrap=b,s,<,>,[,],l,h " Метод фолдинга - вручную (для обычных файлов) set foldmethod=manual " Настраиваем переключение раскладок клавиатуры по set keymap=russian-jcukenwin " Раскладка по умолчанию - английская set iminsert=0 " Необходимо установить для того, чтобы *.h файлам " присваивался тип c, а не cpp. let c_syntax_for_h="" " Просмотр нетекстовых файлов в Vim --> au BufReadPost *.pdf silent %!pdftotext -nopgbrk "%" - |fmt -csw78 au BufReadPost *.doc silent %!antiword "%" au BufReadPost *.odt silent %!odt2txt "%" " Просмотр нетекстовых файлов в Vim <-- " Горячие клавиши --> " Ускоренное передвижение по тексту nmap 5h nmap 5j nmap 5k nmap 5l " Клавиши быстрого редактирования строки в режиме вставки " и в режиме редактирования командной строки. " --> "imap imap imap imap "cmap cmap cmap cmap " <-- " Стрелки для комментариев map - $a --> map = $a <-- " Запуск/сокрытие плагина Winmanager map :WMToggle imap :WMToggle vmap :WMToggle " Запуск/сокрытие плагина Tag List map :TlistToggle imap :TlistToggle vmap :TlistToggle " Очистить подсветку последнего найденного выражения nmap :nohlsearch imap :nohlsearch vmap :nohlsearchgv " Сохранить файл nmap :w! imap :w! vmap :w! " Закрыть VIM nmap :q imap :q vmap :q " Более привычные Page Up/Down, когда курсор остаётся в той же строке, " а не переносится вверх/вниз экрана, как при стандартном PgUp/PgDown. " Поскольку по умолчанию прокрутка по C-U/D происходит на полэкрана, " привязка делается к двойному нажатию этих комбинаций. nmap imap nmap imap " Переключение раскладок и индикация выбранной " в данный момент раскладки. " --> " Переключение раскладок будет производиться по " " При английской раскладке статусная строка текущего окна будет синего " цвета, а при русской - зеленого. function MyKeyMapHighlight() if &iminsert == 0 hi StatusLine ctermfg=DarkBlue guifg=DarkBlue else hi StatusLine ctermfg=DarkGreen guifg=DarkGreen endif endfunction " Вызываем функцию, чтобы она установила цвета при запуске Vim'a call MyKeyMapHighlight() " При изменении активного окна будет выполняться обновление " индикации текущей раскладки au WinEnter * :call MyKeyMapHighlight() cmap imap X:call MyKeyMapHighlight()a nmap a:call MyKeyMapHighlight() vmap a:call MyKeyMapHighlight()gv " <-- " Omni completion inoremap " Горячие клавиши <-- " Меню --> " Включение автоматического разбиения строки на несколько " строк фиксированной длины menu Textwidth.off :set textwidth=0 menu Textwidth.on :set textwidth=75 " Проверка орфографии --> if version >= 700 " По умолчанию проверка орфографии выключена. set spell spelllang= set nospell menu Spell.off :setlocal spell spelllang=:setlocal nospell menu Spell.Russian+English :setlocal spell spelllang=ru,en menu Spell.Russian :setlocal spell spelllang=ru menu Spell.English :setlocal spell spelllang=en menu Spell.-SpellControl- : menu Spell.Word\ Suggestz= z= menu Spell.Add\ To\ Dictionaryzg zg menu Spell.Add\ To\ TemporaryDictionaryzG zG menu Spell.Remove\ From\ Dictionaryzw zw menu Spell.Remove\ From\ Temporary\ DictionaryzW zW menu Spell.Previous\ Wrong\ Word[s [s menu Spell.Next\ Wrong\ Word]s ]s endif " Проверка орфографии <-- " Обертка для :make --> function! MyMake() " Для *.py файлов не открываем новые вкладки, " а просто компилируем текущий файл. if &filetype == "python" write make return endif let old_tab_num = tabpagenr() " Создаем новую вкладку tabe " Помещаем ее в конец tabm let old_buflist = tabpagebuflist(tabpagenr()) make let buflist = tabpagebuflist(tabpagenr()) " Если список буферов не изменился, значит, компиляция прошла " успешно и можно закрыть только что созданную вкладку - она нам " не понадобилась. if old_buflist == buflist tabc execute 'tabn '.old_tab_num " Иначе файл с ошибкой откроется в этой вкладке. else " Раскрываем все складки setlocal foldlevel=9999 endif endfunction nmap ,m :call MyMake() nmap ,w :cwindow nmap ,n :cnext nmap ,p :cprevious nmap ,l :clist menu Make.Make,m ,m menu Make.Make\ Window,w ,w menu Make.Next\ Error,n ,n menu Make.Previous\ Error,p ,p menu Make.Errors\ List,l ,l " Обертка для :make <-- " Обновление ctags --> function! MyUpdateCtags() echo "Update ctags function is not setted." endfunction let MyUpdateCtagsFunction = "MyUpdateCtags" nmap :call {MyUpdateCtagsFunction}() menu ctags.Update " Обновление ctags <-- " Блог --> " Преобразование открытого в данный момент файла в HTML код для " последующей вставки в блог. function! MyConvertFileToHtmlForBlog() runtime syntax/2html.vim %s/
$// %s/\_^\_.*]*>]*>\_\s*/
/
            %s/\_\s*<\/font><\/body>\_.*/<\/font><\/pre>/
        endfunction

        menu Blog.Convert\ file\ to\ HTML\ for\ blog :silent call MyConvertFileToHtmlForBlog()
    " Блог <--


    " Меню Encoding -->
        " Выбор кодировки, в которой читать файл -->
            set wildmenu
            set wcm=
            menu Encoding.Read.utf-8 :e ++enc=utf8 
            menu Encoding.Read.windows-1251 :e ++enc=cp1251
            menu Encoding.Read.koi8-r :e ++enc=koi8-r
            menu Encoding.Read.cp866 :e ++enc=cp866
            map  :emenu Encoding.Read.
        " Выбор кодировки, в которой читать файл <--

        " Выбор кодировки, в которой сохранять файл -->
            set wildmenu
            set wcm=
            menu Encoding.Write.utf-8 :set fenc=utf8 
            menu Encoding.Write.windows-1251 :set fenc=cp1251
            menu Encoding.Write.koi8-r :set fenc=koi8-r
            menu Encoding.Write.cp866 :set fenc=cp866
            map  :emenu Encoding.Write.
        " Выбор кодировки, в которой сохранять файл <--

        " Выбор формата концов строк (dos - , unix - , mac - ) -->
            set wildmenu
            set wcm=
            menu Encoding.End_line_format.unix :set fileformat=unix
            menu Encoding.End_line_format.dos :set fileformat=dos
            menu Encoding.End_line_format.mac :set fileformat=mac
            map  :emenu Encoding.End_line_format.
        " Выбор формата концов строк (dos - , unix - , mac - ) <--
    " Меню Encoding <--


    " Перевод слов при помощи консольной версии StarDict -->
        function! TranslateWord()
            let s:dict    = "sdcv"
            let s:phrase  = expand("")
            let s:tmpfile = tempname()

            silent execute "!" . s:dict . " " . s:phrase . " > " . s:tmpfile

            let s:lines = system("wc -l " . s:tmpfile . "| awk '{print $1}'")

            if s:lines == 0
                echo s:phrase . ": Not found."
            else
                execute "botright sp " . s:tmpfile
            end
        endfun

        map  :call TranslateWord()
        menu Translate.Translate_word :call TranslateWord()
    " Перевод слов при помощи консольной версии StarDict <--
" Меню <--


" Задаем собственные функции для назначения имен заголовкам табов -->
    function! MyTabLine()
        let tabline = ''

        " Формируем tabline для каждой вкладки -->
            for i in range(tabpagenr('$'))
                " Подсвечиваем заголовок выбранной в данный момент вкладки.
                if i + 1 == tabpagenr()
                    let tabline .= '%#TabLineSel#'
                else
                    let tabline .= '%#TabLine#'
                endif

                " Устанавливаем номер вкладки
                let tabline .= '%' . (i + 1) . 'T'

                " Получаем имя вкладки
                let tabline .= ' %{MyTabLabel(' . (i + 1) . ')} |'
            endfor
        " Формируем tabline для каждой вкладки <--

        " Заполняем лишнее пространство
        let tabline .= '%#TabLineFill#%T'

        " Выровненная по правому краю кнопка закрытия вкладки
        if tabpagenr('$') > 1
            let tabline .= '%=%#TabLine#%999XX'
        endif

        return tabline
    endfunction

    function! MyTabLabel(n)
        let label = ''
        let buflist = tabpagebuflist(a:n)

        " Имя файла и номер вкладки -->
            let label = substitute(bufname(buflist[tabpagewinnr(a:n) - 1]), '.*/', '', '')

            if label == ''
                let label = '[No Name]'
            endif

            let label .= ' (' . a:n . ')'
        " Имя файла и номер вкладки <--

        " Определяем, есть ли во вкладке хотя бы один
        " модифицированный буфер.
        " -->
            for i in range(len(buflist))
                if getbufvar(buflist[i], "&modified")
                    let label = '[+] ' . label
                    break
                endif
            endfor
        " <--

        return label
    endfunction

    function! MyGuiTabLabel()
        return '%{MyTabLabel(' . tabpagenr() . ')}'
    endfunction

    set tabline=%!MyTabLine()
    set guitablabel=%!MyGuiTabLabel()
" Задаем собственные функции для назначения имен заголовкам табов <--


" Переключение между заголовочными файлами и
" файлами с исходным кодом.
" -->
    "   Соответственно:
    "   ,s - переключение на исходный код
    "   ,S - тоже самое, только открыть в новом окне
    "   ,h - переключение на заголовочный файл
    "   ,H - тоже самое, только открыть в новом окне

    nmap ,h :call MySwitchToHeader()
    nmap ,H :call MySwitchToHeaderInNewWindow()
    nmap ,s :call MySwitchToSource()
    nmap ,S :call MySwitchToSourceInNewWindow()

    function! MySwitchToHeader()
        if &filetype == "c"
            find %:t:r.h
            return
        end

        if &filetype == "cpp"
            find %:t:r.hpp
            return
        end
    endfunction

    function! MySwitchToHeaderInNewWindow()
        if &filetype == "c"
            sf %:t:r.h
            return
        end

        if &filetype == "cpp"
            sf %:t:r.hpp
            return
        end
    endfunction

    function! MySwitchToSource()
        if &filetype == "c"
            find %:t:r.c
            return
        end

        if &filetype == "cpp"
            find %:t:r.cpp
            return
        end
    endfunction

    function! MySwitchToSourceInNewWindow()
        if &filetype == "c"
            sf %:t:r.c
            return
        end

        if &filetype == "cpp"
            sf %:t:r.cpp
            return
        end
    endfunction
" <--