Last active
October 30, 2024 04:21
-
-
Save novusnota/65dcc593df6d9909ffb59eb83fe69a28 to your computer and use it in GitHub Desktop.
Простая конфигурация, конфиг Vim для тех, у кого русско-английская клавиатура. Для русскоязычных, короче (duh). Минималистичная, минимум плагинов, но с развёрнутым описанием каждой функции, настройки и команды.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" Простая конфигурация 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 | |
" работает только в рамках одного ввода и только если | |
" под конец поставить пробел | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
statusline-vim posts