Главная >> Инструкции >> Настройка Vim

Настройка Vim

Vim - это очень сложный, но в то же время очень популярный текстовый редактор текста среди пользователей операционных систем Linux. Программа позволяет перемещаться по тексту и выполнять большинство действий с помощью клавиатуры, это очень сильно ускоряет работу за компьютером, поэтому что вам не надо постоянно переносить руку на мышь и обратно.

В нескольких предыдущих статьях я рассказывал про основы работы с Vim и основные команды программы, сегодня же хочу поговорить о настройке и персонализации программы. Добавление нескольких строчек в конфигурационный файл может сделать Vim намного удобнее. Несмотря на то, что в тексте я буду писать Vi, речь будет идти про современную версию редактора - Vim.


Содержание статьи

Настройка редактора Vim

Основной конфигурационный файл Vim находится в папке /etc/. Это файл /etc/vimrc/vimrc. Кроме того, для каждого отдельного пользователя можно настроить Vi с помощью локального конфигурационного файла, который находится в домашней папке ~/.vimrc. Вы можете использовать тот файл, который вам надо, например:

vim ~/.vimrc

Я рекомендую комментировать если не каждую строчку, то хотя бы каждую секцию, потому что если вы этого не будете делать, то потом не разберетесь что и зачем добавляли. Для комментария добавьте перед строкой символ кавычки - ".

1. Отступы и нумерация строк

Если вы собрались программировать в Vi, то вам надо обязательно разобраться с отступами. В стандартах многих языков программирования рекомендуется использовать пробелы вместо табов, а каждый отступ оформлять фиксированным количеством пробелов, например, стандарт Python PEP-8 рекомендует использовать четыре пробела. Чтобы это настроить добавьте такие строки:

set expandtab
set smarttab
set tabstop=4
set softtabstop=4
set shiftwidth=4

Переменная expandtab включает замену табов на пробелы, tabstop - количество пробелов в одном обычном табе, softtabstop - количество пробелов в табе при удалении, smarttab - при нажатии таба в начале строки добавляет количество пробелов равное shiftwidth.

Чтобы добавить нумерацию строк добавьте такую команду:

set number

Раз мы уже заговорили про отступы, давайте сделаем ещё небольшой отступ между левой частью окна:

set foldcolumn=2

2. Внешний вид

Для редактора доступно несколько цветовых схем. Вы можете посмотреть все доступные схемы открыв редактор и набрав там команду :colorscheme, затем пробел, а затем Tab:

Для выбора цветовой схемы на постоянной основе добавьте в конфигурационный файл такую строчку

colorscheme имя_цветовой_схемы

Например:

colorscheme delek

Для многих языков программирования есть подсветка синтаксиса, чтобы её включить добавьте:

syntax on

3. Звук

При нажатии неверной клавиши или ошибке в Vim проигрывается специальный звук. Если он вам мешает, его можно отключить:

set noerrorbells
set novisualbell

4. Поддержка мыши

Если вы работаете в графическом окружении, то, возможно, вам понадобиться поддержка мышки. Поддержка может быть добавлена в несколько режимов работы программы:

  • n - обычный режим;
  • v - визуальный режим (режим выделения);
  • i - режим вставки;
  • c - режим командой строки;
  • a - все перечисленные ранее режимы;
  • r - для режима "Нажмите Enter" или запроса ввода информации.

В большинстве случаев чтобы включить мышку во всех режимах программы достаточно добавить такую строчку:

set mouse=a

Также можно включить мышку только в визуальном режиме:

set mouse=v

Или вовсе её отключить:

set mouse=

При включённой поддержке мыши, вы все ещё можете копировать текст в системный буфер обмена, для этого просто зажмите клавишу Shift.

5. Настройка привязок

Очень полезная возможность Vim - это настройка своих привязок клавиш. Для этого существует функция map. Она похожа на alias в Linux и сообщает программе, что если мы вводим что-то, то хотим сделать ещё что-то. Здесь прежде чем переходить к настройке нужно понять как это работает. Синтаксис map простой:

map набор_символов_или_сочетание_клавиш на_что_заменить

Откройте редактор и выполните там команду:

:map losst <ESC>iHello world!<CR>

При вводе набора символов losst программа нажимает клавишу Esc, затем вводит i чтобы перейти в режим редактирования, потом пишет приветствие и добавляет символ перевода строки. Клавиши, которые надо нажать пишутся в скобках <>.

Мы рассмотрели общую команду map, но существуют также отдельные команды для других режимов:

  • nmap - нормальный режим;
  • vmap - визуальный режим;
  • omap - режим, когда выбран оператор действия (y,p или d);
  • cmap - режим командной строки;
  • imap - режим вставки.

Кроме того есть не рекурсивный вариант команды. Например, если на слово Hello назначить ещё одну замену, то в нашем примере она сработает. Но в не рекурсивном варианте всё равно будет вставлено Hello. Не рекурсивные варианты команды тоже есть для всех режимов, это noremap, vnoremap, nnoremap, onoremap, cnoremap и inoremap.

Но это ещё не всё. В начале пользовательских привязок клавиш принято использовать клавишу <leader> по умолчанию это обратный слеш. Например, если сделать вот так:

:map <leader>losst <ESC>iHello world!<CR>

Тогда для выполнения этой привязки надо набрать \losst. Использовать обратный слеш не всегда удобно, поэтому часто его заменяют на запятую. Для этого в конфигурационный файл надо добавить:

let mapleader = ","

Теперь вы знаете как настроить привязки клавиш в vim и что это всё означает. Теперь можно добавить сочетание клавиш для быстрого сохранения:

nmap <leader>w :w!<cr>

Поиск дальше нажатием пробела:

map <space> /

Поиск предыдущего вхождения по нажатию Ctrl+Пробел:

map <C-space> ?

Более удобное перемещение между открытыми вкладками редактора:

map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l

Включение или отключение проверки орфографии:

map <leader>ss :setlocal spell!<CR>

Таким образом, вы можете сделать более удобным и быстрым любое действие в редакторе.

6. Буфер обмена

Vim использует специальный внутренний буфер обмена для копирования и вставки текста, он никак не связан с системным. Постоянная проблема пользователей Vim в графическом интерфейсе, это невозможность что-либо скопировать непосредственно из визуального режима Vim в системный буфер обмена. Если окно редактора пусто, нет никаких дополнительных настроек или плагинов, можно просто копировать текст из терминала, но если запустить vim в tmux или screen, то тут уже возникнет проблема. Она решается. В Vim существуют специальные регистры для системного буфера обмена, это + и *. К ним можно получить доступ с помощью клавиши ".

Но сначала надо убедится, что ваша версия Vim поддерживает работу с системным буфером обмена. Для этого выполните:

vim --version | grep clipboard

Если вы видите надпись +clipboard, значит всё хорошо. В противном случае надо искать другую версию vim. В Ubuntu или Debian для поддержки буфера обмена можно установить пакет vim-gtk:

sudo apt install vim-gtk

Теперь, когда вы нажмете "+y в визуальном режиме, выделенный текст будет скопирован в системный буфер обмена, а при нажатии "+p в обычном режиме, содержимое буфера обмена будет вставлено в позицию курсора. Для большего удобства можно добавить горячие клавиши:

inoremap <C-v> <ESC>"+pa
vnoremap <C-c> "+y
vnoremap <C-d> "+d

Теперь чтобы вставить из буфера vim будет достаточно нажать Ctrl+V, а для копирования в буфер обмена системы - Ctrl+C.

7. Настройка поиска

Давайте немного настроим поиск. Для того чтобы игнорировать регистр при поиске добавьте в конфигурационный файл:

set ignorecase
set smartcase

Подсвечивать результаты поиска:

set hlsearch

Чтобы программа подсказывала первое вхождение при вводе шаблона поиска добавьте:

set incsearch

8. Команды

Для сохранения, открытия нового файла в программе и выполнения многих других операций мы вводим команды. Но кроме предустановленных команд вы можете добавлять свои. Для этого используется такая конструкция:

command опции имя действие

В качестве действия может быть указано выполнение какой-либо команды, нажатие клавиш, как в случае с привязками или вызов какой-либо функции. Это очень обширная тема, поэтому я не буду трогать её в этой статье.

Добавьте такую строчку чтобы с помощью команды :W можно было сохранить файл, если он открыт не через sudo:

command! W execute 'w !sudo tee % > /dev/null' <bar> edit!

9. Плагины

Для Vim существует огромное количество различных плагинов и начиная с восьмой версии появилась своя система управления пакетами. Все пакеты должны располагаться в папке ~/.vim, подпапке pack/vendor/start или pack/vendor/opt. Файлы из подпапки start загружаются автоматически при старте программы, и из opt надо подгружать вручную.

Например, давайте установим такой популярный плагин, как NerdTree. Для этого просто склонируйте его с GitHub в эту папку:

git clone https://github.com/preservim/nerdtree.git ~/.vim/pack/vendor/start/nerdtree

После этого разработчики рекомендуют выполнить такую команду, чтобы загрузить страницы справки:

vim -u NONE -c "helptags ~/.vim/pack/vendor/start/nerdtree/doc" -c q

После этого вы можете запустить программу и набрать такую команду для активации панели выбора файлов:

:NERDTreeToggle

Можно добавить горячую клавишу на открытие панели, для этого добавьте в конфигурационный файл:

nmap <F6> :NERDTreeToggle<CR>

Установим для примера ещё один плагин, Vim , который позволяет выполнять unix команды прямо в командной строке редактора:

git clone https://tpope.io/vim/eunuch.git ~/.vim/pack/vendor/start/eunuch

Загрузка справки:

vim -u NONE -c "helptags ~/.vim/pack/vendor/start/eunuch/doc" -c q

Перезагрузите Vim и вы сможете пользоваться и этим плагином. Вообще, вы можете найти подробную инструкцию по установке любого нужного вам плагина на GitHub странице самого плагина.

10. Кодировка

Часто при открытии в Vim тестовых файлов с кириллическими символами, те отображаются неверно. Чтобы они отображались как надо следует выбрать кодировку UTF-8 по умолчанию:

set encoding=utf8

Также можно установить стандарт использования символов переноса строки в файлах:

set ffs=unix,dos,mac

В данном случае на первом месте находится вариант Unix, где для переноса строки используется только символ \n.

Выводы

В этой статье я постарался детально разобрать как выполняется настройка Vim. Вы узнали о базовых переменных, которые надо установить чтобы изменить внешний вид, о привязках клавиш, а также о том как устанавливать плагины. К тому же у нас получился такой файл ~/.vimrc:

"Табы и пробелы
set expandtab
set smarttab
set tabstop=4
set softtabstop=4
set shiftwidth=4
"Нумерация строк и отступ
set number
set foldcolumn=2
"Цветовая схема
colorscheme delek
syntax on
"Без звука
set noerrorbells
set novisualbell
"Мышь
set mouse=a
"Привязки
let mapleader = ","
nmap <leader>w :w!<CR>
map <space> /
map <C-space> ?
map <C-j> <C-W>j
map <C-k> <C-W>k
map <C-h> <C-W>h
map <C-l> <C-W>l
map <leader>ss :setlocal spell!<CR>
inoremap <C-v> <ESC>"+pa
vnoremap <C-c> "+y
vnoremap <C-d> "+d
"Поиск
set ignorecase
set smartcase
set hlsearch
set incsearch
"Выход с sudo
command! W execute 'w !sudo tee % > /dev/null' <bar> edit!
"Кодировка
set encoding=utf8
"Тип переноса
set ffs=unix,dos,mac

Даже этот небольшой конфигурационный файл уже может сильно помочь вам в работе, а дальше останется только расширять его дополнительными командами и привязками клавиш. А какие команды и привязки используете вы? Какие плагины? Поделитесь в комментариях!

Creative Commons License
Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .

9 комментариев к “Настройка Vim”

  1. set nocompatible
    filetype off

    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()

    Plugin 'VundleVim/Vundle.vim'

    Plugin 'scrooloose/nerdtree'
    Plugin 'valloric/youcompleteme'
    Plugin 'xolox/vim-easytags'
    Plugin 'majutsushi/tagbar'
    Plugin 'tpope/vim-fugitive'
    Plugin 'easymotion/vim-easymotion'
    Plugin 'ctrlpvim/ctrlp.vim'
    Plugin 'terryma/vim-multiple-cursors'
    Plugin 'vim-airline/vim-airline'
    Plugin 'vim-airline/vim-airline-themes'
    Plugin 'scrooloose/nerdcommenter'
    Plugin 'matze/vim-move'
    Plugin 'raimondi/delimitmate'
    Plugin 'mattn/emmet-vim'
    Plugin 'scrooloose/syntastic'
    Plugin 'tpope/vim-surround'
    Plugin 'sirver/ultisnips'
    Plugin 'honza/vim-snippets'
    Plugin 'xolox/vim-session'
    Plugin 'xolox/vim-misc'
    Plugin 'SyntaxAttr.vim'
    Plugin 'dyng/ctrlsf.vim'
    Plugin 'rking/ag.vim'
    Plugin 'godlygeek/tabular'

    Plugin 'stanangeloff/php.vim'
    Plugin 'sumpygump/php-documentor-vim'
    Plugin 'arnaud-lb/vim-php-namespace'

    Plugin 'pangloss/vim-javascript'

    Plugin 'othree/html5.vim'

    Plugin 'evidens/vim-twig'

    Plugin 'mtscout6/vim-tagbar-css'

    Plugin 'damage220/solas.vim'
    Plugin 'nanotech/jellybeans.vim'
    Plugin 'mhartington/oceanic-next'

    call vundle#end()

    set tabstop=4
    set shiftwidth=4
    set softtabstop=4

    set autoread

    set autoindent
    set smartindent

    set encoding=utf-8
    set termencoding=utf-8

    set splitright

    set cursorline

    set nocp
    set nu
    set laststatus=2
    set ruler
    set nowrap
    syntax enable
    set background=dark
    colorscheme solas

    set visualbell t_vb=
    set novisualbell

    let g:session_autosave = 'no'

    set fileformat=unix
    set statusline=%f%m%r%h%w\ %y\ enc:%{&enc}\ ff:%{&ff}\ fenc:%{&fenc}%=(ch:%3b\ hex:%2B)\ col:%2c\ line:%2l/%L\ [%2p%%]

    Ответить
  2. "=============================================================================
    "=============================== BASIC SETTINGS ==============================
    "=============================================================================
    filetype plugin indent on
    highlight SpellBad ctermfg=Black ctermbg=Red
    hi StatusLine gui=reverse cterm=reverse
    set autoread
    set backup
    set browsedir=current
    set clipboard=unnamed
    set encoding=utf-8
    set hidden
    set history=128
    set mouse=a
    set nocompatible
    set noswapfile
    set sessionoptions=curdir,buffers,tabpages
    set t_Co=256
    set termencoding=utf-8
    set title
    set undolevels=2048

    "=============================================================================
    "============================== EDITOR SETTINGS ==============================
    "=============================================================================
    autocmd CursorMoved * silent! exe printf("match Search /\\/", expand(''))
    let c_syntax_for_h=""
    let python_highlight_all = 1
    set backspace=indent,eol,start
    set laststatus=2
    set linebreak
    set list
    set listchars=tab:>-,trail:-
    set mps+=
    set noruler
    set number
    set scrolloff=4
    set showcmd
    set showmatch
    set textwidth=80
    set visualbell
    set wrap
    syntax enable

    "=============================================================================
    "================================= COLORSCHEME ===============================
    "=============================================================================
    if empty(glob('~/.vim/colors/sublimemonokai.vim'))
    silent !curl -fLo ~/.vim/colors/sublimemonokai.vim --create-dirs
    \ https://raw.githubusercontent.com/ErichDonGubler/vim-sublime-monokai/master/colors/sublimemonokai.vim
    endif
    set background=dark
    colorscheme sublimemonokai

    "=============================================================================
    "============================ INDENTATION SETTINGS ===========================
    "=============================================================================
    set autoindent
    set expandtab
    set pastetoggle=
    set shiftwidth=4
    set smarttab
    set smartindent
    set softtabstop=4
    set tabstop=4
    au FileType crontab,fstab,make set noexpandtab tabstop=8 shiftwidth=8
    au FileType *.htm,*.html,*.css,*.js set softtabstop=2 tabstop=2 shiftwidth=2 textwidth=120

    "=============================================================================
    "===================== AUTO-COMPLETION OF INPUT (omnifunct) ==================
    "=============================================================================
    autocmd FileType python set omnifunc=pythoncomplete#Complete
    autocmd FileType tt2html set omnifunc=htmlcomplete#CompleteTags
    autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
    autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
    autocmd FileType css set omnifunc=csscomplete#CompleteCSS
    autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
    autocmd FileType php set omnifunc=phpcomplete#CompletePHP
    autocmd FileType c set omnifunc=ccomplete#Complete
    set completeopt=menu

    "=============================================================================
    "====================== COLLAPSING TEXT BLOCKS (folding) =====================
    "=============================================================================
    set foldenable
    "set foldmethod=syntax
    set foldmethod=indent
    set foldcolumn=1
    set foldlevel=2
    set foldopen=all
    set tags=tags\ $VIMRUNTIME/systags

    "=============================================================================
    "========================== FILE MANAGEMENT SETTINGS =========================
    "=============================================================================
    set fileformat=unix
    set fencs=utf-8,cp1251,koi8-r,cp866
    autocmd! bufwritepre $MYVIMRC call setline(1, '"" Last update: '.strftime("%d.%m.%Y %H:%M"))
    filetype on
    filetype plugin on
    filetype indent on
    autocmd FileType perl call SetPerlConf()
    set path=.,,**

    "=============================================================================
    "============================= TEXT SEARCH SETTINGS ==========================
    "=============================================================================
    map /
    map ?
    set ignorecase
    set incsearch
    set nohlsearch
    set smartcase
    vnoremap * :call VisualSearch()//
    vnoremap # :call VisualSearch()?/

    "=============================================================================
    "================================= PLUGINS ===================================
    "=============================================================================
    if empty(glob('~/.vim/autoload/plug.vim'))
    silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs
    \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
    autocmd VimEnter * PlugInstall --sync | source $MYVIMRC
    endif

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

    """""""""""""""""""""""""""""""""""""""""""""""""
    """""""""""" Code/Project Navigation """"""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'scrooloose/nerdtree' "
    Plug 'jistr/vim-nerdtree-tabs' "
    Plug 'majutsushi/tagbar' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """""""""""""""""""""" AWK """"""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'vim-scripts/awk.vim' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """""""""""""""" HTML/CSS/XML """""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'tpope/vim-surround' "
    Plug 'othree/html5.vim' "
    Plug 'hail2u/vim-css3-syntax' "
    Plug 'shmargum/vim-sass-colors' "
    Plug 'ap/vim-css-color' "
    Plug 'Ioannis-Kapoulas/vim-autoprefixer' "
    Plug 'othree/xml.vim' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""""" Java """"""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'uiiaoo/java-syntax.vim' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""" JavaScript """"""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'pangloss/vim-javascript' "
    Plug 'jelera/vim-javascript-syntax' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""""" Nginx """""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'chr4/nginx.vim' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """""""""""""""""""""" PHP """"""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'stanangeloff/php.vim' "
    Plug 'phpactor/phpactor' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""""" Python """"""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'klen/python-mode' "
    Plug 'nvie/vim-flake8' "
    Plug 'mitsuhiko/vim-jinja' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""""" Ruby """"""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug 'vim-ruby/vim-ruby' "
    Plug 'tpope/vim-rails' "
    """""""""""""""""""""""""""""""""""""""""""""""""

    """""""""""""""""""""""""""""""""""""""""""""""""
    """"""""""""""""""""" Other """""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""""""
    Plug '907th/vim-auto-save' "
    Plug 'vim-syntastic/syntastic' "
    Plug 'ycm-core/YouCompleteMe' "
    Plug 'tpope/vim-fugitive' "
    Plug 'airblade/vim-gitgutter' "
    Plug 'fisadev/FixedTaskList.vim' "
    Plug 'vim-scripts/taglist.vim' "
    Plug 'frazrepo/vim-rainbow' "
    Plug 'itchyny/lightline.vim' "
    Plug 'preservim/nerdcommenter' "
    """""""""""""""""""""""""""""""""""""""""""""""""
    call plug#end()

    "=============================================================================
    "=============================== PLUGIN SETTINGS =============================
    "=============================================================================

    """""""""""""""""""""""""""""""""""""""
    """"""""""""""" NERDTree """"""""""""""
    """""""""""""""""""""""""""""""""""""""
    autocmd vimenter * NERDTree
    map :NERDTreeToggle
    :let g:NERDTreeWinSize=24
    let NERDTreeIgnore=['\.pyc$', '\~$']
    let NERDTreeMapOpenInTab='\r'

    """""""""""""""""""""""""""""""""""""""
    """""""""""""" Syntastic """"""""""""""
    """""""""""""""""""""""""""""""""""""""
    set statusline+=%#warningmsg#
    set statusline+=%{SyntasticStatuslineFlag()}
    set statusline+=%*
    let g:syntastic_always_populate_loc_list = 1
    let g:syntastic_auto_loc_list = 1
    let g:syntastic_check_on_open = 1
    let g:syntastic_check_on_wq = 0

    """""""""""""""""""""""""""""""""""""""
    """""""""""" FixedTaskList """"""""""""
    """""""""""""""""""""""""""""""""""""""
    map :TaskList

    Ответить
  3. Здравствуйте уважаемые. Никак не смог найти в сети инфу о том как удалить редактор vim/vi. Я удалял командой apt autoremove vim. Сегодня случайно ввел vi и открылось то же самое окошко. Это как понимать? Помогите удалить весь этот редактор.

    Ответить
    • У vi есть две версии - расширенная - vim и упрощённая vi. Для того чтобы удалить ещё и упрощённую удалите пакет vim.tiny:

      sudo apt-get remove vim.tiny

      Ответить

Оставьте комментарий