Меню

Vim

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

Стоит сказать что создав файл ~/.vimrc, мы тут же отключаем все настройки по умолчанию и поэтому первые строки возвращают их на место.

Общие настройки

~/.vimrc
" FreeBSD
source $VIMRUNTIME/defaults.vim
source $VIMRUNTIME/defaults_freebsd.vim

" Отключить переход в визуальный режим при выделении мышью
set mouse-=a

" Отключить создание мусорных файлов
set nobackup
set nowritebackup
set noswapfile

" Номера строк
set number

" Подсвечивать искомое
set hlsearch

" Игнорировать регистр при поиске
set ignorecase

" не прыгать сразу к искомому
" set noincsearch

" Сброс подсветки найденного
nnoremap q :noh<CR>

" Пробелы вместо табов
set expandtab
set shiftwidth=4
set tabstop=4

" Убрать правый скролл r
" Убрать левый скролл при вертикальном разделении L
set guioptions-=rL

" Шрифт в GUI-режиме
set guifont=Hack

" Вертикальный курсор для режима вставки
let &t_SI = "\e[5 q"
" Блочный курсор для нормального режима
let &t_EI = "\e[1 q"
" Подчёркнутый курсор для режима замены
let &t_SR = "\e[3 q"

" Для плагина переключающего раскладку
" А для dwm есть патч, чтобы отдельные раскладки в каждом окне
let g:XkbSwitchEnabled = 1
let g:XkbSwitchNLayout = 'us'

" Сохранение закладок
set viminfo='1000,<1000,s30,h

function! AiOff()
    let g:autoindent_status = &autoindent
    setlocal noautoindent
endfunction
function! AiOn()
    let &autoindent = g:autoindent_status
endfunction

" pkg install xclip
" autoindent при вставке нужно отключать не только для вставки кода
" даже текст начинает ехать лесенкой
function! CopyToClipboard()
    "get the position of left start visual selection
    let [line_start, column_start] = getpos("'<")[1:2]
    "get the position of right end visual selection
    let [line_end, column_end] = getpos("'>")[1:2]
    "gotta catch them all.
    let lines = getline(line_start, line_end)
    if len(lines) == 0
        return ''
    endif
    "edge cases and cleanup.
    let lines[-1] = lines[-1][: column_end - 0]
    let lines[0] = lines[0][column_start - 1:]

    let filename = '/tmp/vim_clipboard.txt'
    call writefile(lines, filename)
    silent! execute '!truncate -s -1 ' . filename
    silent! execute '!xclip -selection clipboard ' . filename
endfunction
vnoremap <C-c> :call CopyToClipboard()<CR>
nnoremap <C-v> :call AiOff()<CR>:execute "normal! i" . system("xclip -selection clipboard -o")<CR>:call AiOn()<CR>
inoremap <C-v> <Esc>:call AiOff()<CR>:execute "normal! a" . system("xclip -selection clipboard -o")<CR>:call AiOn()<CR>a
" для ру
vnoremap <C-с> :call CopyToClipboard()<CR>
nnoremap <C-м> :call AiOff()<CR>:execute "normal! i" . system("xclip -selection clipboard -o")<CR>:call AiOn()<CR>
inoremap <C-м> <Esc>:call AiOff()<CR>:execute "normal! a" . system("xclip -selection clipboard -o")<CR>:call AiOn()<CR>a


" Копирование и вставка для Windows
" function! AiOff()
"     let g:autoindent_status = &autoindent
"     setlocal noautoindent
" endfunction
" function! AiOn()
"     let &autoindent = g:autoindent_status
" endfunction
" vnoremap <C-c> "*y
" inoremap <C-v> <C-o>:call AiOff()<CR><C-r>+<C-o>:call AiOn()<CR>
" nnoremap <C-v> :call AiOff()<CR>"+gP:call AiOn()<CR>

Переключатель раскладки

Создаем папки ~/.vim/autoload/ и ~/.vim/plugin/, отсюда https://github.com/lyokha/vim-xkbswitch берем файлы из этих папок и кидаем к себе. Этот плагин переключает раскладку клавиатуры на английскую при переходе к режимам где кирилица просто не нужна и только мешает. Единственный плагин который решает проблему вима с раскладками по настоящему хорошо, без всяких "но". Для Windows кроме плагина нужно скачать libxkbswitch64.dll и кинуть рядом с vim.exe. Кроме того файлы помещать в папки autoload и plugin которые в $VIMRUNTIME, узнать где это, можно выполнив в vim команду :echo $VIMRUNTIME.

Открытие файлов .gpg

С помощью команды gpg -c file.txt можно шифровать файлы. И потом с помощью плагина к vim открывать их сразу в редакторе. Аналогичным образом берем два файла отсюда https://github.com/jamessan/vim-gnupg и кидаем их в папки autoload и plugin.

Для новичка:

Открытие, редактирование, закрытие

При запуске вима не получится прямо сходу набирать текст - потому что он запускается в командном режиме где каждое нажатие клавиши является командой. Чтобы переключить его в режим ввода текста нужно нажать i. Чтобы переключиться обратно в командный - нужно нажать Esc.

Создание файла, открытие файла, сохранение файла и закрытие редактора выполняются в командном режиме. Часть команд выполняется обычными нажатиями на клавиши букв. А более сложные начинаются с двоеточия. При нажатии на двоеточие внизу окна появляется поле ввода команды и ее параметров.

Открыть файл

:e путь/к/файлу

Затем i чтобы начать редактировать, Esc чтобы завершить редактирование и записать

:w

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

Закрыть редактор можно командой

:q

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

:q!

На вышеприведенном скриншоте внешний вид приведен в порядок благодаря шрифту и цветовой схеме. Шрифт устанавливается командой

pkg install jetbrains-mono

А цветовая схема взята отсюда https://github.com/sonph/onehalf/tree/master/vim/colors - эти файлы нужно кинуть в папку ~/.vim/colors/

Теперь, чтобы их задействовать, нужно создать файл ~/.vimrc и прописать туда

source $VIMRUNTIME/defaults.vim
source $VIMRUNTIME/defaults_freebsd.vim
colorscheme onehalfdark
set guifont=JetBrainsMono\ Regular

После того как появился файл ~/.vimrc все предыдущие настройки перестают загружаться и чтобы их вернуть и нужны первые две строчки. Можете потренироваться использованию редактора прямо на файле настроек.

Вкладки

Vim даже в консольном режиме поддерживает вкладки. Открыть файл в новой вкладке: :tabnew ~/file_name.txt.

Можно переходить к следующей клавишами gt или к предыдущей клавишами gT или к конкретной по номеру 2gt. Список вкладок можно посмотреть командой :tabs.

Команда :tabmove переместит вкладку вправо в конец. Команда :tabmove 0 переместит вкладку в начало.

Комментировать