Skip to content

Instantly share code, notes, and snippets.

@novusnota
Last active October 30, 2024 04:21
Show Gist options
  • Save novusnota/65dcc593df6d9909ffb59eb83fe69a28 to your computer and use it in GitHub Desktop.
Save novusnota/65dcc593df6d9909ffb59eb83fe69a28 to your computer and use it in GitHub Desktop.
Простая конфигурация, конфиг Vim для тех, у кого русско-английская клавиатура. Для русскоязычных, короче (duh). Минималистичная, минимум плагинов, но с развёрнутым описанием каждой функции, настройки и команды.
" Простая конфигурация Vim для пользователей с русско-английской клавиатурой
" Как правило, русскоязычных (duh)
" Минималистичная, минимум плагинов, но с развёрнутым описанием каждой функции, настройки и команды
" Работает для Vim 8.*, скомпилированного по максимуму.
" Чистый конфиг, без использования менеджеров плагинов.
" Цветовые схемы вручную копировал в папку ~/.vim/
" Также, ручками добавил
" lightline и NERDTree в ~/.vim/pack/plugins/start,
" а NERDCommenter в ~/.vim/plugin
"
" vim-jumpmotion для быстрых перемещений по текущему окну,
" добавил прямо в корень ~/.vim, используя:
" rsync -aP папка-с-содержимым-плагина ~/.vim
" Никаких других функциональных плагинов и примочек не устанавливал.
" Исключения: подсветка синтаксиса для Kotlin и Crystal
" Прежде, чем начнём, отключим обратную совместимость с vi,
" старой версией Vim'а. Вообще, наличие файла ~/.vimrc
" по умолчанию выключает её, но на всякий случай
" полезно явным образом это указать
set nocompatible
" И ещё одна маленькая настройка для того,
" чтобы плагины (NERDTree, NERDCommenter и lightline)
" вообще работали
filetype plugin indent on
" -----------------------------
" --- Частичная русификация ---
" -----------------------------
" >>> Решение 1, в лоб
" Работа с вводом (INSERT) без переключения раскладки
noremap ш i
noremap Ш I
noremap ф a
noremap Ф A
noremap щ o
noremap Щ O
" Работа с заменой (REPLACE) без переключения раскладки
noremap к r
noremap К R
" Работа с режимом выделения (VISUAL) без переключения раскладки
noremap м v
noremap М V
" Работа с поиском:
" следующее и предыдущее совпадение без переключения раскладки
noremap т n
noremap Т N
" Копировать, удалить и вставить без переключения раскладки
noremap н y
noremap Н Y
noremap в d
noremap В D
noremap ч x
noremap Ч X
noremap з p
noremap З P
" Перемещения к началу/концу слов без переключения раскладки
noremap ц w
noremap Ц W
noremap у e
noremap У E
noremap и b
noremap И B
" Некоторые прочие русские буквы
noremap й q
noremap Й Q
noremap с c
noremap С C
noremap п g
noremap П G
" Тут важен именно map, чтобы в дальнейшем
" можно было убрать стандартное действие
" (удаление символа/строки и переход в режим INSERT)
map ы s
map Ы S
" Одинарные кавычки: ' в режиме ввода (INSERT) по нажатию Ctrl+э
inoremap <C-э> '
" Двойные кавычки: " в режиме INSERT по нажатию Ctrl+Shift+Э
" Решётка/хэштег: # в режиме INSERT по нажатию Ctrl+Shift+Три
" Меньше-больше/угловые скобки: < и > в режиме INSERT дают
" Ctrl+Shift+б и Ctrl+Shift+ю соответственно
"" Квадратные скобки так не работают:
"" noremap <C-х> [
"" noremap <C-ъ> ]
" Потому что конфликтуют с управляющими последовательностями ANSI
" НО, можно использовать Compose key
" См. https://ru.wikipedia.org/wiki/Compose
" Тут больше символов указано: https://fsymbols.com/keyboard/linux/compose/
" Так, [ и ] можно ввести с помощью Compose+(+( и Compose+)+) соответственно
" А { и } можно вводить с помощью Compose+-+( и Compose+-+) соответственно
" <<<
" >>> Решение 2, сторонняя программа для переключения xkb layout
" https://github.com/grwlf/xkb-switch
" Поскольку русское символы нужны лишь во режиме INSERT,
" можно назначить отдельные команды для входа и выхода в этот режим
" с переключением текущей раскладки (предполагается, что EN)
" на русскую при входе, и сменой на английскую при выходе из режима
" К примеру, использовать Ctrl+l
" <<<
" >>> Решение 3, встроенные раскладки в Vim
" https://habr.com/ru/post/98393/
" !!!
" Работает даже для голого терминала (tty), без графического окружения
" (Без DE и WM, без Xorg/Wayland)
" !!!
" Переключение между кириллицей и латиницей Ctrl+^ в режиме INSERT
" (Просто Ctrl+6-ка в английской раскладке)
" При этом, сохраняются все английские настройки для других режимов,
" как будто используем английскую раскладку, хотя в режиме INSERT набираем текст по-русски
" Подключение встроенного файла с русской йцукен клавиатурой.
" Возможные варианты: russian-%вариация%:
" jcuken, jcukenwin, jcukenwintype, jcukenmac, typograph, yawerty, dvorak
" set keymap=russian-jcukenwin
" Все доступные раскладки лежат тут - %папка с конфигами Vim%/keymap/
" Чтобы вставка и поиск работали, как надо
" set iminsert=0
" set imsearch=0
" Чтобы можно было так же нажимать Ctrl-l для переключения, помимо Ctrl+^
" inoremap <C-l> <C-^>
" Дополнительная подсветка для курсора, чтобы различать режимы
" highlight lCursor guifg=NONE guibg=Cyan
" -----------------------------
" --- Привычные комбинации ----
" --- клавиш для редакторов ---
" --- вне терминала -----------
" -----------------------------
" Ctrl+s для сохранения файла и возврата в нормальный режим (NORMAL)
" из NORMAL
nnoremap <C-s> :w<CR>
" из INSERT
inoremap <C-s> <Esc>:w<CR>
" из VISUAL
vnoremap <C-s> <Esc>:w<CR>
" Ctrl+c для закрытия текущего файла, находясь в режиме NORMAL
nnoremap <C-c> :q<CR>
" Ctrl+z для отмены изменений и Ctrl+x для возврата к изменениям
" в режимах NORMAL, VISUAL и INSERT
nnoremap <C-z> :undo<CR>
vnoremap <C-z> <Esc>:undo<CR>
inoremap <C-z> <Esc>:undo<CR>i
nnoremap <C-x> :redo<CR>
vnoremap <C-x> <Esc>:redo<CR>
inoremap <C-x> <Esc>:redo<CR>i
" Двигать текущую строку в режиме NORMAL
" вверх и вниз по нажатию Ctrl+Shift+Вверх/Вниз,
" где Вверх/Вниз это соответствующие стрелки на клавиатуре
nnoremap <silent> <C-S-Up> :m .-2<CR>
nnoremap <silent> <C-S-Down> :m .+1<CR>
" Аналогично, но уже для режима VISUAL
" перемещение нескольких строк за раз
vnoremap <silent> <C-S-Up> :m '<-2<CR>gv
vnoremap <silent> <C-S-Down> :m '>+1<CR>gv
" -----------------------------
" --- Комментирование
" --- и раскомментирование
" --- строк в NERDCommenter
" -----------------------------
" Убираем стандартные сочетания клавиш
let g:NERDCreateDefaultMappings = 0
" Добавляем пробел после комментария
let g:NERDSpaceDelims = 1
" Используем компактный синтаксис
let g:NERDCompactSexyComs = 1
" Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDDefaultAlign = 'left'
" Разрешаем комментировать пустые строки
let g:NERDCommentEmptyLines = 1
" Эта настройка будет удалять лишние пробелы после крайнего
" непробельного символа в строке после раскомментирования
" Лучше выключить, потому что эта Vim конфигурация и так сама
" чистит файл (см. функция на ~528 строке)
let g:NERDTrimTrailingWhitespace = 0
" Разрешаем проверку на то, закомментирована строка или нет
let g:NERDToggleCheckAllLines = 1
" Комментировать и раскомментировать строку
" в режиме NORMAL по нажатию Ctrl+/
nmap <C-_> <Plug>NERDCommenterToggle
" Аналогично, но для режима VISUAL
vmap <C-_> <Plug>NERDCommenterToggle<CR>gv
" По какой-то причине, Vim видит нажатие Ctrl+/, как Ctrl+_
" Подробнее смотри тут: https://stackoverflow.com/questions/9051837/how-to-map-c-to-toggle-comments-in-vim
" -----------------------------
" --- Настройка отступов, -----
" --- переносов и табуляции ---
" -----------------------------
" Табуляция, использование 4-х пробелов вместо \t
set tabstop=4
set shiftwidth=4
set smarttab
set expandtab
" Настройка табуляции для отдельных типов файлов
"autocmd FileType C++ setlocal ts=2 sw=2
" Перенос длинных строк с разбиением по пробелам, а не по символам
" (слова переносятся целиком, soft wrap)
set wrap
set linebreak
" Иногда, нужно добавлять ещё и nolist, чтобы это сработало:
" set nolist
" Принудительный перенос от 120 символов.
" Если наберётся 120 символов до конца экрана -
" то перенесёт на следующую строку следующее слово,
" а иначе, сработает soft wrap выше и разместит новое
" слово в той же строке, но визуально разобьёт их на две
set tw=120
" Выключение принудительного переноса (hard wrap):
" set tw=0
" Установка smartindent и autoindent для табуляции
set smartindent
" autoindent: новые строчки копируют отступы прежних
" Иногда плохо срабатывает при вставке, можно закомментировать
" set autoindent
" Менять уровень табуляции для режима VISUAL по нажатию > и <
vnoremap <silent> > >gv
vnoremap <silent> < <gv
" -----------------------------
" --- Автодополнения в --------
" --- режиме INSERT -----------
" -----------------------------
" ~~~
" Простое дополнение
" ~~~
" Дополняет слово, ориентируясь на слова в текущем файле
" Ctrl+n - следующий вариант
" Ctrl+p - предыдущий
" После нажатия любой комбинации выше можно использовать
" стрелки Вверх/Вниз для перебора вариантов
" ~~~
" Расширенное дополнение
" ~~~
" Нажать Ctrl+x, а затем нажать Ctrl + нужный способ
" Способов много, см.: https://vim.fandom.com/wiki/Any_word_completion
" Наиболее полезные:
" - Ctrl+f - файловое дополнение
"
" - Ctrl+l - дополнение всей строки
" (если есть похожая строка в файле)
"
" - Ctrl+o - омнидополнение функций (omnifunc)
" (по синтаксису текущего типа файла)
" Чтобы меню возникало всегда, и по умолчанию не автодополняло
set completeopt=longest,menuone
" Настраиваем 'умное' автодополнение по нажатию Tab:
" - если нечего дополнять, то используем Tab, как обычно
function! SmartTabComplete()
" Если меню с выбором уже открылось, перейти к следующему варианту
if pumvisible()
return "\<C-n>"
endif
" Содержимое текущей строки
let l:line = getline('.')
" Берём подстроку от начала текущей строки
" и до положения курсора, но можно написать
" и col('.') + 1, чтобы брать чуть больше
let l:substr = strpart(l:line, -1, col('.'))
" Проверяем,состоит ли строка только из пробельных символов
let l:substr = matchstr(l:substr, '[^ \t]*$')
if (strlen(l:substr)==0) " nothing to match on empty string
return "\<Tab>"
endif
let l:has_period = match(l:substr, '\.') != -1 " position of period, if any
let l:has_slash = match(l:substr, '\/') != -1 " position of slash, if any
if (!l:has_period && !l:has_slash)
return "\<C-x>\<C-n>" " existing text matching
elseif (l:has_slash)
return "\<C-x>\<C-f>" " file matching
else
return "\<C-x>\<C-o>" " plugin matching
endif
endfunction
" Взято с: https://vim.fandom.com/wiki/Smart_mapping_for_tab_completion
" Дополнил с помощью: https://stackoverflow.com/questions/9751540/omnicomplete-in-vim-with-shift-tab-not-working
" Заменил <C-r>= перед названием функции
" на <expr> перед Tab, и удалил <CR> на конце
" (по сравнению с примерами по ссылкам выше)
inoremap <expr><Tab> SmartTabComplete()
" Обратный скролл вариантов Tab на Shift+Tab (в том числе отмена первого изменения)
inoremap <expr><S-Tab> pumvisible() ? "\<C-p>" : "\<C-n>"
" Выбор дополнения по нажатию Enter, вместо перевода строки
inoremap <expr><CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
" Вручную настраиваем типы файлов для дополнения omnifunc
" (например: js, php, ruby, html, c, css, python)
"autocmd FileType html,xhtml setl ofu=htmlcomplete#CompleteTags
"autocmd FileType css setl ofu=csscomplete#CompleteCSS
"autocmd FileType js setl ofu=javascriptcomplete#CompleteJS
"autocmd FileType php setl ofu=phpcomplete#CompletePHP
"autocmd FileType c setl ofu=ccomplete#CompleteCpp
"autocmd FileType py setl ofu=pythoncomplete#CompletePython
" Или же включаем для всех доступных типов файлов
set omnifunc=syntaxcomplete#Complete
" Подробнее про автодополнения можно узнать, загуглив 'vim completion'
" Ещё, можно установить YouCompleteMe или SuperTab
" https://vim.fandom.com/wiki/Make_Vim_completion_popup_menu_work_just_like_in_an_IDE
" -----------------------------
" --- Курсор и мышь -----------
" -----------------------------
" Работа с мышью
" оставить только прокрутку
" set mouse-=a
" прокрутка + корректное выделение
" set mouse=n
" полностью включить
" (при выделении мышью будет временно
" переходить в режим VISUAL)
" set mouse=a
set mouse=a
" Показывать позицию курсора справа внизу (обычно, панель находится там)
set ruler
" Гибридная нумерация строк слева:
" номер текущей строки + относительные номера строк сверху и снизу
set number relativenumber
" Всегда иметь визуальные отступы в 5 строк
" от верхнего и нижнего края экрана Vim до курсора.
set scrolloff=5
" Подсвечивать строку на которой находится курсор
set cursorline
" Прекратить подсвечивать её при переходе в режим INSERT
autocmd InsertEnter,InsertLeave * set cursorline!
" Показывать колонну на 120 символе строк (по счёту)
"set colorcolumn=120
" Показывать колонну на 80, 120, 160 и последующих символах строк (по счёту)
"let &colorcolumn="80,120,".join(range(160,999),",")
" Убрать мерцание курсора в режиме INSERT и превратить его в линию, вместо блока
let &t_SI = "\<Esc>[6 q"
let &t_EI = "\<Esc>[2 q"
let &t_SR = "\<Esc>[4 q"
" Может не работать для каждого терминала, так что лучше
" посмотреть, как сделать это для вашего вот здесь:
" https://vim.fandom.com/wiki/Change_cursor_shape_in_different_modes
" Или, использовать NeoVim, в котором этот пункт работает сразу, «из коробки»
" -----------------------------
" --- Прочие сочетания --------
" --- клавиш ------------------
" -----------------------------
" Чтобы можно было сохранить файл, который может
" редактировать root пользователь.
" Введи :w!! и нажми Enter/Return в нормальном режиме -
" Vim подставит нужную команду и сохранит файл
cnoremap w!! w !sudo tee > /dev/null %
" Копирование от текущего символа до конца строки
" в режиме NORMAL при нажатии Shift+Y
" (Как Shift+D, только не удаляет скопированные символы)
nnoremap Y y$
" Открыть терминал по нажатию Ctrl+q в режиме NORMAL
" Терминал откроется в разделённом окне. Работа с окнами
" в Vim похожа на tmux, управляющее сочетание: Ctrl+w
" Переключиться между окнами: <Сочетание>+Стрелка Вверх/Вниз/Вправо/Влево
nnoremap <C-q> :terminal<CR>
" Убираю Shift+s, а то бесит :)
noremap S <Nop>
" Перемещение Вверх/Вниз на один абзац текста
" во всех режимах при нажатии Ctrl+Вверх/Вниз
noremap <silent> <C-Up> {
noremap <silent> <C-Down> }
" Превратить выделенные строки в TODO-list в GitHub-markdown (- [ ])
" в режиме VISUAL по нажатию Ctrl+t
vnoremap <silent> <C-t> :<C-u>'<,'>g/^[\-\ ]*/s//\='- [ ] '/<CR><Esc>
" Превратить выделенные строки в ненумерованный список (- )
" в режиме VISUAL по нажатию Ctrl+l
vnoremap <silent> <C-l> :<C-u>'<,'>g/^[\-\ ]*/s//\='- '/<CR><Esc>
" Пронумеровать выделенные строки в режиме VISUAL по нажатию Ctrl+e
vnoremap <silent> <C-e> :<C-u>let i=1 \| '<,'>g/^\d*\.\{0,1}[\-\ ]*/s//\=i.'. '/ \| let i=i+1<CR><Esc>
" Ввод emoji в режиме INSERT по нажатию Ctrl+e.
" Используем npm пакет smil, или любой другой по вкусу :)
inoremap <C-e> <Esc>:!smil<CR>Pa
" В режиме NORMAL: добавление двух строк ниже, переход к последней
" и включение режима INSERT
nnoremap <expr>o "o\<Esc>o"
" В режиме NORMAL: добавление двух строк ниже, переход к последней,
" добавление строки ниже и включение режима INSERT
nnoremap <expr>O "o\<Esc>o\<Esc>O"
" Поиск по выделенному тексту из режима VISUAL по нажатию /
vnoremap / "ay/\V<C-R>=escape(@a,'/\')<CR><CR>
" -----------------------------
" --- Настройка NERDTree: -----
" --- файловый менеджер -------
" --- внутри Vim --------------
" -----------------------------
" Окно NERDTree управляется так же,
" как и другие окна в Vim, используя
" Ctrl+w или режим комманд (EX)
"
" Закрыть его можно, нажав q
" Автооткрытие окна NERDTree
" при запуске Vim
" autocmd VimEnter * NERDTree
" Автооткрытие окна NERDTree,
" при открытии директории в Vim
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter *
\ if argc() == 1
\ && isdirectory(argv()[0])
\ && !exists("s:std_in")
\ | exe 'NERDTree' argv()[0]
\ | wincmd p | ene
\ | exe 'cd '.argv()[0]
\ | endif
" Автозакрытие окна NERDTree,
" если сам Vim уже закрыли
autocmd BufEnter *
\ if (winnr("$") == 1
\ && exists("b:NERDTree")
\ && b:NERDTree.isTabTree())
\ | q | endif
" Открыть/закрыть окно NERDTree
" по нажатию , в режиме NORMAL
nmap <silent> , :NERDTreeToggle<CR>
" Показываем скрытые файлы (.что-то)
let g:NERDTreeShowHidden = 1
" Показываем нумерацию папок и файлов
let g:NERDTreeShowLineNumbers = 1
" -----------------------------
" --- Прочие настройки --------
" -----------------------------
" Сделать размер истории последних изменений
" для undo/redo равным 1000
set undolevels=1000
set history=1000
" «Умный» поиск:
" - при вводе только маленьких (строчных) букв
" ищет регистро-независимо
" - а если введена хотя бы одна большая (заглавная/прописная)
" буква, то будет искать регистро-зависимо
set ignorecase
set smartcase
" Выделять частичные совпадения сразу.
" Полезно выключить для корректной замены (:substitute)
" в режиме VISUAL
"set incsearch
" Оставляет подсветку после завершения поиска.
" Чтобы очистить прошлый поиск :let @/ = ''
" Включить
" set hlsearch
" Выключить
set nohlsearch
" Временно выключить
" :noh
" Чтобы можно было использовать Backspace
" для удаления в режиме INSERT
set backspace=indent,eol,start
" Чтобы по нажатию на стрелки Влево/Вправо или h/l,
" перемещаться с конца строки на начало следующей
" и с начала строки в конец предыдущей.
" https://superuser.com/questions/35389/in-vim-how-do-i-make-the-left-and-right-arrow-keys-change-line
set whichwrap+=<,>,h,l,[,]
" Настройка копирования из буфера Vim
" в системный/внешний буфер и обратно
"if has('unnamed')
" set clipboard=unnamed
"endif
if has('unnamedplus')
set clipboard=unnamedplus
endif
" Если не сработал предыдущий пункт,
" В терминале набери vim --version,
" И если там будет -clipboard, а не +clipboard,
" то нужно будет скомпилировать Vim самостоятельно с такой опцией
"
" Или же, устанавливаем xclip
" (apt install xclip,
" pacman -S xclip
" и т.п. в других дистрибутивах)
" И копируем в xclip после копирования в Vim:
autocmd TextYankPost * call system('xclip', @0)
" Вставить текст из xclip в Vim в режиме NORMAL
" (Лучше не использовать, а просто переходить в режим
" INSERT и уже там копировать по нажатию Ctrl+v или Ctrl+Shift+V)
"nnoremap p :r!xclip -o<CR>
" Копирование в xclip на F7
" Вставка из xclip на Shift+F7
"map <F7> :w !xclip<CR><CR>
"vmap <F7> "*y
"map <S-F7> :r!xclip -o<CR>
" Автообновление, при изменении файла извне
set updatetime=2000
set autoread
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * checktime
" CursorMoved, CursorMovedI
" Функция, убирающая лишние пробелы на концах строк,
" лишние строки в файле, а также лишние строки под конец файла
function! CleanupBeforeWrite()
" Запоминаем позицию курсора
let l:line = line('.')
let l:col = col('.')
" Убрать лишние пробелы на концах строк
" % перед s означает, что нужно сразу во всём файле заменять
:%s/\s\+$//e
" Добавить пустые строки под конец файла
" (нужно, чтобы правильно их усечь до одной впоследствии)
:$s/$/\=repeat("\r", 5)/e
" Убрать лишние пустые строки в избыточном количестве
:%s/\n\{5,}/\r\r/e
" Странно, но при замене \r - это newline,
" а \n - это null.
" https://stackoverflow.com/questions/3965883/vim-replace-character-to-n
" https://unix.stackexchange.com/questions/247329/vim-how-to-replace-one-new-line-n-with-two-ns
" Оставляем только одну пустую строку под конец файла
:$-1,$s/\n//e
" Возвращаем курсор в исходное положение
call cursor(l:line, l:col)
endfunction
" Автовызов функции выше перед сохраненем файла
" autocmd BufWritePre * call CleanupBeforeWrite()
" Или, вызов по нажатию Ctrl+l.
" Чистит, а затем сохраняет изменения в файл
nnoremap <silent> <C-l> :call CleanupBeforeWrite()<CR>:w<CR>
" Автоматическое добавление пустой строки
" под конец файла средствами Vim, если таковая отсутствует
" (Не всегда работает, поэтому использую функцию выше)
"set endofline
"set fixendofline
" Автоматическое открывание новых окон вниз
" Под окнами я имею в виду разделение экрана, как в tmux
" Например, открыть терминал в окне, это :terminal или :term
"set splitbelow
" Сделать окно терминала высотой в 12 строк.
" Высота строк окна терминала равна высоте строки в Vim
set termwinsize=12x0
" Не обновлять экран во время исполнения скриптов и макросов,
" чтобы экран не мерцал и не подвисал на больших файлах
set lazyredraw
" Ускорить вывод символов на экран
set ttyfast
" Использовать расширенный синтаксис регулярных выражений по умолчанию
set magic
" Показывать автодополнение в режиме команд
" (EX, :) в виде меню
set wildmenu
set wildchar=<Tab>
" Игнорировать эти форматы файлов в меню
set wildignore+=*.so,*.swp,*.zip,*.gz,*.xz,*.pyc,*.db,*.sqlite,*.jpg,*.png
" Ограничить максимальное число вкладок до 20
set tabpagemax=20
" Не сбрасывать скопированное после вставки:
xnoremap p pgvy
xnoremap P Pgvy
" Выключить звуки и мерцание экрана при ошибках
set noerrorbells visualbell t_vb=
autocmd GUIEnter * set visualbell t_vb=
" Также может сработать:
" set belloff=all
" Отключение бэкапных файлов Vim, ведь скорее всего,
" весь код уже в какой-нибудь VCS: mercury или git
" ЕСЛИ ВЫ РАБОТАЕТЕ ПО SSH, ЛУЧШЕ ЗАКОММЕНТИРОВАТЬ,
" потому что соединение может оборваться и вы потеряете
" все последние изменения
set nobackup
set nowb
set noswapfile
" Установка UTF-8 стандартной кодировкой для файлов
set encoding=utf8
" Использование формата Unix (LF) по умолчанию
set ffs=unix,dos,mac
" -----------------------------
" --- Больше красок -----------
" -----------------------------
" 256 цветов (Использовать RGB)
set t_Co=256
" Тот же параметр, но вне графического сервера (Xorg, Wayland)
if !has('gui_running')
set t_Co=256
endif
" Включение подсветки синтаксиса
syntax enable
" Включение цветов в терминале
if has('termguicolors')
set termguicolors
endif
" Чиним отображение цветов в alacritty
if &term == 'alacritty'
let &term='xterm-256color'
endif
" Альтернативный вариант починки
" let &t_8f = '\<Esc>[38;2;%lu;%lu;%lum'
" let &t_8b = '\<Esc>[48:2;%lu;%lu;%lum'
" Изменение цветовой палитры редактора на тёмную
set background=dark
" А можно и на светлую, light
" ~~~
" Настройки для вашей темы для кода
" Я использую Gruvbox:
" - Dark Hard от Morhetz
" - Или её адаптацию под цветовую палитру Material Design
" ~~~
" Другие интересные темы:
" - Solarized Light/Dark
" - New Moon (от Tania Rascia), есть только Dark
" - Monokai (и её вариации)
" - Atom One Dark
" - Darcula, есть только Dark
" - Base16 вариации всех тем выше
colorscheme gruvbox
let g:gruvbox_background = 'hard'
" ~~~
" Настройки для lightline, альтернативного плагина
" для статусной полосы внизу окна Vim
" https://github.com/itchyny/lightline.vim
" Можно добавить встроенными средствами Vim:
" https://vimhelp.org/repeat.txt.html#packages
" ~~~
" В настройках lightline (autoload/lightline.vim) я перенёс вкладки (tabline)
" на статусную строку, см.: https://github.com/itchyny/lightline.vim/issues/313
" Поэтому тут я убираю стандартную tabline
set showtabline=0
" Убрать дублирующее описание режима в командной строке под полосой
" Но оставить размер текущего выделения в режиме VISUAL
set showcmd
set noshowmode
" Показываем линию статуса
set laststatus=2
" Включаем нужную подсветку синтаксиса
" (.vim файл, предоставленный моей цветовой схемой, в папке airline)
" У вашей цветовой схемы такого отдельного файла может не быть :)
let g:lightline = {}
let g:lightline.colorscheme = 'gruvbox'
" Не делать комментарии курсивными в gruvbox_material
" let g:gruvbox_material_disable_italic_comment = 1
" Чтобы показывать в номере столбца не только номер байта,
" но и номер символа, относительно начала строки.
" Будет отображаться как: ${номер байта}-${номер символа}
"
" Дело в том, что символы в UTF-8 занимают два байта,
" а в других кодировках может быть и больше,
" поэтому важно отобразить и номер байта и номер символа.
" Смотри: https://stackoverflow.com/questions/13544640/vim-how-does-the-statusline-v-work
"
" В lightline/autoload/lightline.vim нужно примерно на 109 строчке заменить
" внутри 'component' и внутри 'column' с '%c' на '%c%V'
" ~~~
" Другие варианты statusline/statusbar (статусная панель внизу):
" - Мега-плагин airline со всем-всем:
" https://github.com/vim-airline/vim-airline
"
" - Плагин, чтобы показывать в командной строке все буфферы Vim:
" https://github.com/bling/vim-bufferline
" Буффер в Vim это ~= файл. Подробнее про схожесть и различия можно посмотреть
" тут: https://dev.to/iggredible/using-buffers-windows-and-tabs-efficiently-in-vim-56jc
"
" - Вообще заменить табы на буфферы (не про статусбар, но прикольно):
" https://github.com/ap/vim-buftabline | https://vimawesome.com/plugin/buftabline
"
" - Сделать простую самому:
" https://kadekillary.work/post/statusline-vim/
" Как пример:
" set laststatus=2
" set statusline=
" set statusline+=\ %l
" set statusline+=\ %*
" set statusline+=\ ‹‹
" set statusline+=\ %f\ %*
" set statusline+=\ ››
" set statusline+=\ %m
" set statusline+=\ %F
" set statusline+=%=
" set statusline+=\ ‹‹
" set statusline+=\ %{strftime('%R', getftime(expand('%')))}
" set statusline+=\ ::
" set statusline+=\ %n
" set statusline+=\ ››\ %*
" ~~~
" -----------------------------
" --- Немного про emoji -------
" -----------------------------
" Вероятно, открыв файл с emoji c помощью Vim
" или любого другого редактора в системе, основанной на Linux
" (Debian/Ubuntu, Arch/Manjaro, Fedora/CentOS/OpenSUSE, и т.д.),
" вы увидете не сами emoji, а лишь непонятные квадраты с 6 символами внутри.
"
" Технически, это и есть emoji, т.е. специальные символы в Unicode, просто система
" не знает, как их отображать, поэтому просто пишет их коды (U+"Те 6 символов")
"
" Чтобы система поняла, как их нужно выводить emoji, ей нужен шрифт, поддерживающий их.
" Простой способ работы со шрифтами в любой Linux-подобной системе это fontconfig.
"
" Установите его:
" Debian/Ubuntu: apt install fontconfig
" Arch/Manjaro: pacman -S fontconfig
" CentOS/Fedora/RHEL/OpenSUSE: yum install fontconfig
" и т.д., для вашей системы будет похожая команда.
"
" Затем, нужно скачать 2 .ttf файла (два шрифта) из папки fonts
" в https://github.com/googlefonts/noto-emoji
"
" И поместить их в ~/.local/share/fonts или ~/.fonts
" (Если нет таких папок, то создайте)
"
" После того, как поместили, можно воспользоваться fontconfig
" и обновить кэш шрифтов в системе командой:
" fc-cache -f -v
"
" Теперь, если откроете файл с emoji, они будут отображаться, как надо,
" как в Vim и терминале, так и за их пределами.
" -----------------------------
" И, напоследок, если хочется большего, то есть:
" 1. https://habr.com/ru/post/468265/
" 2. vimtutor
" 3. Vim Wiki
" 4. https://github.com/learnbyexample/vim_reference
" 5. https://github.com/mhinz/vim-galore
" 6. https://github.com/mireadev/vim-cheat-sheet
" 7. https://vimhelp.org/repeat.txt.html
" 8. Google/Yandex/DuckDuckGo, ну или Bing (sarcasm)
" Если вам vi/Vim ухудшает работу, а не улучшает, посмотрите:
" 1. https://stackoverflow.com/questions/1218390/what-is-your-most-productive-shortcut-with-vim
" 2. Ещё более развёрнутый вариант из первого пункта:
" https://gist.github.com/nifl/1178878
" 3. https://stackoverflow.com/questions/1088387/what-specific-productivity-gains-do-vim-emacs-provide-over-gui-text-editors
" Как говорится, 'У Vim есть не только кривая входа, но и довольно крутая кривая выхода =)'
" Удачи!
" P.S.: не забудь поставить <Звезду>, мне будет приятно :)
" P.P.S.: вот сюда: https://gist.github.com/novusnota/65dcc593df6d9909ffb59eb83fe69a28
" -----------------------------
" --- ОФФТОП-ОФФТОП -----------
" --- Плагин-песочница --------
" --- (тестирую разное) -------
" -----------------------------
" let g:keysound_enable = 1
" let g:keysound_theme = 'default'
" или default, typewriter, mario, sword, bubble
" let g:keysound_py_version = 2
" let g:keysound_volume = 500
" abbreviate
ab :computer: 💻
" ab :ec: !# 'file.js' javascript
" ab :ec: [embedmd]:# (file.js javascript)
" https://github.com/campoy/embedmd
" emojilib - make it real
" работает только в рамках одного ввода и только если
" под конец поставить пробел
@DenisUstinov
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment