diff --git a/vim/README.md b/vim/README.md new file mode 100644 index 0000000..7b0f6b2 --- /dev/null +++ b/vim/README.md @@ -0,0 +1 @@ +http://konishchevdmitry.blogspot.com/2008/07/howto-vim.html diff --git a/vim/vimrc b/vim/vimrc new file mode 100644 index 0000000..b040398 --- /dev/null +++ b/vim/vimrc @@ -0,0 +1,468 @@ +" Включаем мышку даже в текстовом режиме +" (очень удобно при копировании из терминала, т. к. без этой опции, +" например, символы табуляции раскладываются в кучу пробелов). +set mouse=a + +" Минимальная высота окна +set winminheight=0 +" Минимальная ширина окна +set winminwidth=0 +" Всегда отображать статусную строку для каждого окна +set laststatus=2 + +" Опции автодополнения - включаем только меню с доступными вариантами +" автодополнения (также, например, для omni completion может быть +" окно предварительного просмотра). +set completeopt=menu + +" Размер табуляции +set tabstop=2 +" Размер сдвига при нажатии на клавиши << и >> +set shiftwidth=2 +" Копирует отступ от предыдущей строки +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
+" <--