/
huginn
/
termux-dotfiles
Обзор
Документация
Войти
/
huginn
/
termux-dotfiles
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
vim/vimrc
1 659 строк
46 KB
huginn
Added proxy settings.
18 июл 2026, 14:29
18 июл 2026, 14:29
38e3dbe
Код
Авторство
О чём код?
vim9script # path: $XDG_CONFIG_HOME/vim/vimrc # ОБЩЕЕ {{{1 # включение поддержки типов файлов, отступов, плагинов, подсветки синтаксиса if has('autocmd') filetype plugin indent on endif if has('syntax') && !exists('g:syntax_on') syntax enable endif # }}}1 # ОПЦИИ {{{1 # 1. important {{{2 # runtimepath {{{3 # каталоги для файлов vim if !isdirectory($XDG_DATA_HOME .. "/vim/after") mkdir($XDG_DATA_HOME .. "/vim/after", "p") endif set runtimepath^=$XDG_DATA_HOME/vim set runtimepath+=$XDG_DATA_HOME/vim/after # packpath {{{3 # каталоги для плагинов if !isdirectory($XDG_DATA_HOME .. "/vim/pack") mkdir($XDG_DATA_HOME .. "/vim/pack", "p") endif set packpath^=$XDG_DATA_HOME/vim/pack # pastetoggle {{{3 # клавиша для включения режима вставки (Break) set pastetoggle=<Esc>[34~ # }}}3 # }}}2 # 2. moving around, searching and patterns {{{2 # whichwrap {{{3 # какие команды влево-вправо перемещают курсор за конец строки (<Backspace>, <Space>, <Left> и <Right> в нормальном, визуальном, вставки и замены) set whichwrap=b,s,>,<,[,] # cdhome {{{3 # переход по команде cd без аргументов в домашний каталог set cdhome # autochdir {{{3 # автосмена каталога на текущий в буфере set autochdir # ignorecase {{{3 # регистронезависимый поиск set ignorecase # smartcase {{{3 # регистрозависимый поиск, если шаблон содержит буквы в верхнем регистре set smartcase # incsearch {{{3 # инкрементальный поиск set incsearch # maxmempattern {{{3 # поиск без ограничений по памяти set maxmempattern=2000000 # }}}3 # }}}2 # 3. tags {{{2 # }}}2 # 4. displaying text {{{2 # smoothscroll {{{3 # прокрутка по экранным строкам set smoothscroll # scrolloff {{{3 # количество отображаемых строк вокруг текущей set scrolloff=0 # linebreak {{{3 # переносить строки по символам, указанным в 'breakat' set linebreak # breakindent {{{3 # сохранять отступы у перенесённых строк set breakindent # breakindentopt {{{3 # настройки 'breakindent' # list:-1 — добавляет отступ для списков по ширине списочного указателя set breakindentopt=list:-1 # breakat {{{3 # по каким символам разрывать строку set breakat+=_ # display {{{3 # отображение текста # lastline: показывать заполнители в конце перенесённой последней экранной строки set display=lastline # fillchars {{{3 # символы-заполнители set fillchars=vert:‖,fold: ,eob:~,lastline:> # redrawtime {{{3 # лимит времени для перерисовки экрана в мс set redrawtime=10000 # listchars {{{3 # символы, используемые в режиме 'list' set listchars=tab:>\ ,trail:-,extends:>,precedes:<,nbsp:+ # number {{{3 # показывать номера строк set number # }}}3 # }}}2 # 5. syntax, highlighting and spelling {{{2 # hlsearch {{{3 # подсветка результатов поиска set hlsearch # cursorline {{{3 # выделение строки под курсором set cursorline # cursorlineopt {{{3 # как выделять строку под курсором (экранная строка, номер строки) set cursorlineopt=screenline,number # spelllang # языки для проверки правописания set spelllang=ru_yo,en_us # spellcapcheck {{{3 # шаблон определения конца предложения для проверки правописания set spellcapcheck=[.?!…]\\_[\\])'\"\ \ ]\\+ # spelloptions {{{3 # опции проверки правописания (в camel-case каждая часть слова с заглавной как отдельное слово) set spelloptions=camel # }}}3 # }}}2 # 6. multiple windows {{{2 # laststatus {{{3 # когда показывать строку состояния у окна (всегда) set laststatus=2 # statusline {{{3 # строка статуса # g:ColorModeInStatus {{{4 # возвращает символы режима и цвет фона def g:ColorModeInStatus(): string var cur_mode = mode(1) # нормальный режим if cur_mode ==# 'n' return '%3*n%*' # режим вставки elseif cur_mode ==# 'i' return '%2*i%*' # <C-o> в режиме вставки elseif cur_mode ==# 'niI' return '%2*n%*' # автодополнение в режиме вставки elseif cur_mode ==# 'ic' return '%2*c%*' # контекстное автодополнение в режиме вставки elseif cur_mode ==# 'ix' return '%2*x%*' # командный режим elseif cur_mode ==# 'c' return '%1*c%*' # визуальный посимвольный режим elseif cur_mode ==# 'v' return '%4*v%*' # визуальный построчный режим elseif cur_mode ==# 'V' return '%4*V%*' # визуальный блочный режим elseif cur_mode ==# "\x16" return '%4*^V%*' # посимвольный режим выбора elseif cur_mode ==# 's' return '%6*s%*' # построчный режим выбора elseif cur_mode ==# 'S' return '%6*S%*' # блочный режим выбора elseif cur_mode ==# "\x13" return '%6*^S%*' # <C-o> в режиме выбора (любого) elseif cur_mode ==? 'vs' || cur_mode ==# "\x13s" return '%6*n%*' # режим замены elseif cur_mode ==# 'R' return '%5*R%*' # <C-o> в режиме замены или виртуальной замены elseif cur_mode ==# 'niR' || cur_mode ==# 'niV' return '%5*n%*' # автодополнение в режиме замены или виртуальной # замены elseif cur_mode ==# 'Rc' || cur_mode ==# 'Rvc' return '%5*c%*' # контекстное автодополнение в режиме замены или # виртуальной замены elseif cur_mode ==# 'Rx' || cur_mode ==# 'Rvx' return '%5*x%*' # режим терминала elseif cur_mode ==# 't' return '%8*t%*' # нормальный режим терминала elseif cur_mode ==# 'nt' return '%8*n%*' # если не определён else return '%7*' .. cur_mode .. '%*' endif enddef # g:ArgsInStatus {{{4 # возвращает текущую позицию в списке аргументов и общее кол-во аргументов, если больше одного def g:ArgsInStatus(): string var args_num = len(argv()) if args_num > 1 var cur_arg = argidx() + 1 return $'-{cur_arg}({args_num})' else return '' endif enddef # возвращает тип файла, кодировку, если не utf-8, # и формат, если не unix def g:FileInfoInStatus(): string var fileType = &filetype var fileEncStart = &fileencoding var fileFormatStart = &fileformat var fileEnc = '' var fileFormat = '' if fileEncStart !=? 'utf-8' && fileEncStart !=? '' fileEnc = $'({fileEncStart})' endif if fileFormatStart !=? 'unix' && fileEncStart !=? '' fileFormat = $'({fileFormatStart})' endif return fileType .. fileEnc .. fileFormat enddef # }}}4 # номера буфера и списка аргументов set statusline=%8*%n%{g:ArgsInStatus()}%* # тип файла, кодировка, конец строки set statusline+=%5*%{g:FileInfoInStatus()}%* # имя файла с обрезкой в начале set statusline+=\ %<%t # индикаторы изменения и только для чтения set statusline+=\ %(%m%r%w%q%) # выравнивание по правому краю set statusline+=%= # номер строки-колонки и общее количество строк set statusline+=%#TabLine#%l-%v(%L)%* # цветной индикатор режима set statusline+=%{%g:ColorModeInStatus()%} # winheight {{{3 # минимальная высота текущего окна в строках set winheight=3 # previewpopup {{{3 # всплывающее окно превью set previewpopup=height:40,width:40 # hidden {{{3 # не выгружать буфер закрытого окна set hidden # splitbelow {{{3 # открывать новое окно снизу set splitbelow # splitright {{{3 # открывать новое окно справа set splitright # }}}3 # }}}2 # 7. multiple tab pages {{{2 # tabclose {{{3 # при закрытии вкладки переходить к предыдущей активной if exists('+tabclose') set tabclose=uselast endif # tabpagemax {{{3 # максимальное количество вкладок, открываемых с опцией -p или командой :tab all set tabpagemax=50 # }}}3 # }}}2 # 8. terminal {{{2 # title {{{3 # устанавливать заголовок терминала set title # titlestring {{{3 # формат заголовка терминала set titlestring=VIM:\ %<%F # }}}3 # }}}2 # 9. using the mouse {{{2 # mouse {{{3 # использовать мышь во всех режимах set mouse=a # }}}3 # }}}2 # 10. printing {{{2 # }}}2 # 11. messages and info {{{2 # shortmess {{{3 # сокращение некоторых сообщений (m — + вместо modified, r — RO вместо readonly, W — ничего вместо written, S — номер/всего совпадений при поиске, T — обрезка сообщений посередине) set shortmess+=m shm+=r shm+=W shm-=S # showcmd {{{3 # отображение вводимой команды set showcmd # noshowmode {{{3 # не показывать текущий режим set noshowmode # confirm {{{3 # показывать диалог при неудавшейся команде set confirm # helplang {{{3 # основной язык для файлов справки set helplang=ru # }}}3 # }}}2 # 12. selecting text {{{2 # selectmode {{{3 # начинать selection mode при использовании клавиш перемещения с шифтом set selectmode=key # keymodel {{{3 # поведение при использовании спецклавиш в selection mode (начинать выделение) set keymodel=startsel # }}}3 # }}}2 # 13. editing text {{{2 # undofile {{{3 # автоматически сохранять и восстанавливать историю отмен set undofile # undodir {{{3 # каталоги для файлов истории изменений if !isdirectory($XDG_STATE_HOME .. "/vim/undo") mkdir($XDG_STATE_HOME .. "/vim/undo", "p") endif set undodir^=$XDG_STATE_HOME/vim/undo # textwidth {{{3 # реальная ширина экрана if exists('$ANDROID_DATA') def SetTextWidth(): void if &columns < 80 var real_cols: number if &number if &numberwidth - 1 < len(line('$')) real_cols = &columns - len(line('$')) - 1 else real_cols = &columns - &numberwidth endif else real_cols = &columns endif &textwidth = real_cols execute $"setlocal textwidth={real_cols}" else setlocal textwidth=0 endif enddef autocmd_add([{ replace: true, group: 'TextWidth', event: 'BufReadPost', pattern: '*', cmd: 'call SetTextWidth()', }]) endif # backspace {{{3 # поведение клавиш удаления в режиме вставки set backspace-=start backspace+=nostop # formatoptions {{{3 # опции форматирования текста (не форматировать комментарии автоматически) set formatoptions-=c autocmd_add([{ replace: true, group: 'FmtOpts', event: 'BufReadPost', pattern: '*', cmd: 'setlocal formatoptions-=c formatoptions-=r formatoptions-=o formatoptions-=t', }]) # completeopt {{{3 # опции дополнения if has("patch-9.1.1308") set completeopt=menu,nearest,popup,longest else set completeopt=menu,popup,longest endif # completepopup {{{3 # опции информационного окна дополнения if has("patch-9.1.1856") set completepopup=align:item,border:round,borderhighlight:PmenuSel,close:off,height:30,highlight:PopupSelected,resize:off,shadow:off,width:40 else set completepopup=align:item,height:30,highlight:PopupSelected,width:40 endif # pumheight {{{3 # максимальная высота окна автодополнения set pumheight=15 # pummaxwidth {{{3 # максимальная ширина окна автодополнения if has("patch-9.1.1250") set pummaxwidth=45 endif # pumborder {{{3 # границы всплывающего меню if has("patch-9.1.1835") set pumborder=round endif # omnifunc {{{3 # контекстное автодополнение def AuOmni(): void if &omnifunc == '' setlocal omnifunc=syntaxcomplete#Complete endif enddef autocmd_add([{ replace: true, group: 'OmniComp', event: 'FileType', pattern: '*', cmd: 'call AuOmni()', }]) # infercase {{{3 # регистр дополнения в зависимости от контекста set infercase # matchpairs {{{3 # парные символы для перемещения по % set matchpairs=(:),{:},[:],«:» # nojoinspaces {{{3 # не использовать двойной пробел при объединении строк set nojoinspaces # nrformats {{{3 # как использовать <C-a> и <C-x> set nrformats-=octal try set nrformats+=blank catch # endtry # }}}3 # }}}2 # 14. tabs and indenting {{{2 # tabstop {{{3 # размер табуляции set tabstop=2 # shiftwidth {{{3 # размер отступа set shiftwidth=2 # smarttab {{{3 # значение tab в начале строки берётся из 'shiftwidth' set smarttab # softtabstop {{{3 # размер табуляции при вводе set softtabstop=2 # shiftround {{{3 # округлять до кратного значения 'shiftwidth' отступы при командах > и < set shiftround # expandtab {{{3 # вводить пробелы вместо табуляции set expandtab # autoindent {{{3 # автоматические отступы для новых строк set autoindent # }}}3 # }}}2 # 15. folding {{{2 # foldlevelstart {{{3 # все складки свёрнуты при открытии файла set foldlevelstart=0 # foldopen {{{3 # какие команды открывают складки set foldopen-=hor # foldminlines {{{3 # минимальное количество строк в складке, которую можно закрыть (0 — 1 строка) set foldminlines=0 # foldmethod {{{3 # метод для определения складок set foldmethod=syntax # }}}3 # }}}2 # 16. diff mode {{{2 # }}}2 # 17. mapping {{{2 # ttimeoutlen {{{3 # задержка для кейкодов (мс) set ttimeoutlen=10 # }}}3 # }}}2 # 18. reading and writing files {{{2 # autoread {{{3 # автоматически перечитывать файл при изменениях извне set autoread # nofixeol {{{3 # не добавлять автоматически перевод строки в конце файла set nofixeol # }}}3 # }}}2 # 19. the swap file {{{2 # noswapfile {{{3 # не использовать swap-файлы set noswapfile # }}}3 # }}}2 # 20. command line editing {{{2 # history {{{3 # сколько команд хранить в истории set history=10000 # wildcharm {{{3 # символ вызова автодополнения set wildcharm=<Tab> # wildmode {{{3 # поведение автодополнения в командной строке (дополнить до самого длинного совпадения и вызвать меню) set wildmode=longest:full # wildoptions {{{3 # опции автодополнения (использовать всплывающее меню) set wildoptions=pum # cmdwinheight {{{3 # высота командной строки set cmdwinheight=10 # }}}3 # }}}2 # 21. executing external commands {{{2 # shell {{{3 # устанавливаем свой конфиг для bash, чтобы терминал запускался с ним if $SHELL =~ 'bash$' && filereadable(expand('$XDG_CONFIG_HOME/bash/bashrc')) set shell=$SHELL\ --rcfile\ $XDG_CONFIG_HOME/bash/bashrc endif # keywordprg {{{3 # программа для man-страниц set keywordprg=:Man # }}}3 # }}}2 # 22. running make and jumping to errors {{{2 # }}}2 # 23. language specific {{{2 # isfname {{{3 # допустимые символы для имён файлов внутри диапазона &-) — &'() — из-за конфликта с багованным модулем perl, ^ в диапазоне по той же причине if exists('$ANDROID_DATA') set isfname+=`,&-),;,{,},!,[,]-^,@-@ endif # langmap {{{3 # соответствие русской и английской раскладок if exists('$ANDROID_DATA') set langmap=АБЦДЕФГХИЖКЛМНОПЬРСТУВЮЧЙЗ;ABCDEFGHIJKLMNOPQRSTUVWXYZ,абцдефгхижклмнопьрстувючйз;abcdefghijklmnopqrstuvwxyz endif # langremap {{{3 # использовать сопоставления langmap set langremap # }}}3 # }}}2 # 24. multi-byte characters {{{2 # fileencodings {{{3 # проверяемые кодировки для определения set fileencodings=utf-8,utf-16,utf-16le,cp1251,koi8-r,cp866,cp1252 # maxcombine {{{3 # максимальное число отображаемых символов в комбинированном set maxcombine=6 # }}}3 # }}}2 # 25. various {{{2 # sessionoptions {{{3 # что сохранять в сессии # buffers,curdir,help,options,tabpages,winsize,terminal set ssop-=blank ssop-=folds ssop+=localoptions ssop+=globals # viewdir {{{3 # каталог для файлов view if !isdirectory($XDG_STATE_HOME .. "/vim/view") mkdir($XDG_STATE_HOME .. "/vim/view", "p") endif set viewdir=$XDG_STATE_HOME/vim/view # viminfo {{{3 # как записывать viminfo set viminfo+=! # viminfofile {{{3 # файл viminfo if !isdirectory($XDG_STATE_HOME .. "/vim/info") mkdir($XDG_STATE_HOME .. "/vim/info", "p") endif set viminfofile=$XDG_STATE_HOME/vim/info/viminfo # }}}3 # }}}2 # terminal options {{{2 # t_SI {{{3 # вид курсора в режиме вставки &t_SI = "\e[6 q" # t_SR {{{3 # вид курсора в режиме замены &t_SR = "\e[4 q" # t_EI {{{3 # вид курсора в нормальном режиме &t_EI = "\e[2 q" # }}}3 # }}}2 # }}}1 # НАСТРОЙКИ ДЛЯ ТИПОВ ФАЙЛОВ {{{1 # awk {{{2 # awk это gawk g:awk_is_gawk = 1 # css {{{2 def CssOpt() if executable('prettier') setlocal formatprg=prettier\ --parser\ css endif enddef autocmd_add([{ replace: true, group: 'CssAu', event: 'FileType', pattern: 'css', cmd: 'call CssOpt()', }]) # help {{{2 def HelpSyn() # опции hi link helpOption PreProc # цели переходов hi link helpHyperTextEntry Comment # примеры # hi link helpExample String # заголовки hi helpHeader cterm=bold ctermfg=173 # разделители секций hi link helpSectionDelim Comment # специальные элементы hi link helpSpecial Type # примеры hi link helpExample String enddef autocmd_add([ { replace: true, group: 'HelpAu', event: 'FileType', pattern: 'help', cmd: 'setlocal concealcursor+=v', }, { replace: true, group: 'HelpAu', event: 'Syntax', pattern: 'help', cmd: 'call HelpSyn()', } ]) # html {{{2 # складки g:html_syntax_folding = 1 # тип отступов для встроенных языков (один отступ) g:html_indent_script1 = "auto" g:html_indent_style1 = "auto" # один отступ для атрибутов g:html_indent_attribute = 1 def HtmlOpt() if executable('html-beautify') setlocal formatprg=html-beautify\ -s\ 2 endif enddef autocmd_add([{ replace: true, group: 'HtmlAu', event: 'FileType', pattern: 'html', cmd: 'call HtmlOpt()', }]) # json {{{2 import autoload 'dist/json.vim' autocmd_add([{ replace: true, group: 'JsonAu', event: 'FileType', pattern: 'json', cmd: 'setlocal formatexpr=json.FormatExpr()', }]) # man {{{2 # открытие в новой вкладке g:ft_man_open_mode = 'tab' # включение складок g:ft_man_folding_enable = 1 # markdown {{{2 # включение складок g:markdown_folding = 1 # подсветка кода других языков g:markdown_fenced_languages = ['html', 'css', 'bash=sh'] # readline {{{2 # добавить подсветку bash-специфичных команд g:readline_has_bash = 1 def ReadlineSyn() # новые функции readline syn keyword readlineFunction arrow-key-prefix backward-byte bash-vi-complete bracketed-paste-begin clear-display do-lowercase-version execute-named-command export-completions fetch-history forward-byte history-substring-search-backward history-substring-search-forward next-screen-line non-incremental-forward-search-history-again non-incremental-reverse-search-history-again old-menu-complete previous-screen-line shell-transpose-words spell-correct-word tty-status vi-bWord vi-back-to-indent vi-backward-bigword vi-backward-word vi-bword vi-eWord vi-edit-and-execute-command vi-end-bigword vi-eword vi-fWord vi-forward-bigword vi-forward-word vi-fword vi-insertion-mode vi-overstrike vi-overstrike-delete vi-rubout vi-unix-word-rubout vi-yank-pop \ contained # новые переменные # строки syn keyword readlineVariable active-region-end-color active-region-start-color \ contained \ nextgroup=readlineString \ skipwhite # булевы syn keyword readlineVariable byte-oriented enable-active-region force-meta-prefix prefer-visible-bell search-ignore-case \ contained \ nextgroup=readlineBoolean \ skipwhite # косяк в оригинальном файле, плюс и минус перед числом должны быть опциональны (хотя вообще не помню, чтоб там были знаки) syn match readlineNumber '[+-]\?\d\+\>' \ contained \ display # после последовательности может идти не только функция, но и такая же последовательность syn match readlineKeyTerminator ':' \ contained \ nextgroup=readlineFunction,readlineKeySeq \ skipwhite # другие цвета # режимы hi link readlineEditingMode PreProc hi link readlineKeymap PreProc # escape-последовательности hi link readlineKeyEscape PreProc # разделители hi link readlineKeyTerminator Normal hi link readlineKeySeparator Normal enddef autocmd_add([{ replace: true, group: 'ReadlineAu', event: 'Syntax', pattern: 'readline', cmd: 'call ReadlineSyn()', }]) # sh {{{2 # включить складки g:sh_fold_enabled = 7 # контекст для подсветки g:sh_minlines = 1000 # не подсвечивать ошибки g:sh_no_error = 1 def ShOpt() setlocal include=\\v^\\s*(source\|\\.)\\s+ setlocal breakindentopt= setlocal breakat-=_ if exists('g:loaded_surround') # массив по 'a' b:surround_97 = "\"${\r[@]}\"" # переменная по 'v' b:surround_118 = "\"$\r\"" # подстановка команды по 's' b:surround_115 = "\"$(\r)\"" # арифметическая подстановка по 'n' b:surround_110 = "$((\r))" endif enddef autocmd_add([{ replace: true, group: 'ShAu', event: 'FileType', pattern: 'sh', cmd: 'call ShOpt()', }]) # text {{{2 # распознавать нумерованные списки, не переносить после однобуквенного слова, автодополнение по словарю autocmd_add([{ replace: true, group: 'TextAu', event: 'FileType', pattern: 'text', cmd: 'setlocal fo+=n fo+=1 complete+=kspell', }]) # vim {{{2 # добавление различных типов складок g:vimsyn_folding = 'acefhiH' # не подсвечивать строки внутри комментариев g:vimsyn_comment_strings = false def VimSyn() # переменные hi link vimVar Identifier # квадратные скобки для индексов переменных hi link vimSubscriptBracket Special # команда def hi link vimDef Statement # имя пользовательской функции при определении hi link vimDefName Function hi link vimFunctionName Function hi link vimFuncScope Function # вызов пользовательской функции hi link vimUserFunc Function hi link vim9UserFunc Function # опция в виде переменной hi link vimOptionVar vimOption hi link vimOptionVarName vimOption # синтаксические группы при определении hi link vimGroupName Identifier # группы подсветки с командой highlight hi link vimGroup Identifier hi link vimHiGroup vimGroup # параметры команды highlight hi link vimHiTerm PreProc hi link vimHiCTerm PreProc hi link vimHiCtermFgBg PreProc hi link vimHiGui PreProc hi link vimHiGuiFgBg PreProc # оператор параметров highlight hi link vimHiKeyList Operator # значения параметров команды highlight hi link vimHiAttrib vimSetEqual hi link vimHiNmbr vimSetEqual enddef autocmd_add([ { replace: true, group: 'VimAu', event: 'FileType', pattern: 'vim', cmd: 'setlocal keywordprg=:help', }, { replace: true, group: 'VimAu', event: 'Syntax', pattern: 'vim', cmd: 'call VimSyn', } ]) # xml {{{2 # включение складок g:xml_syntax_folding = 1 # терминал {{{2 # отключаем номера строк autocmd_add([{ replace: true, group: 'SetTermWin', event: 'TerminalWinOpen', pattern: '*', cmd: 'setlocal nonumber', }]) # }}}2 # }}}1 # ДРУГИЕ НАСТРОЙКИ {{{1 # Цветовая схема {{{2 silent! colorscheme TomorrowNightBright # Mapleader {{{2 g:mapleader = ' ' # Системный буфер обмена {{{2 if has('clipboard_provider') def ClipTermuxAvail(): bool if executable("termux-clipboard-set") && executable("termux-clipboard-get") return true else return false endif enddef def ClipTermuxCopy(reg: string, type: string, data: list<string>) var str: string = data->join("\n") system('termux-clipboard-set', str) enddef def ClipTermuxPaste(reg: string): list<any> var data: list<string> = systemlist('termux-clipboard-get') var type: string if len(data) > 1 type = "l" else type = "c" endif return [type, data] enddef v:clipproviders["termux"] = { "available": function("ClipTermuxAvail"), "copy": { "+": function("ClipTermuxCopy"), "*": function("ClipTermuxCopy") }, "paste": { "+": function("ClipTermuxPaste"), "*": function("ClipTermuxPaste") }, } set clipmethod^=termux endif # }}}2 # }}}1 # НАЗНАЧЕНИЯ КЛАВИШ {{{1 # Общее {{{2 # подключение alt {{{3 def MapAlt(s: number, e: number): void var sym: string for c in range(s, e) sym = nr2char(c) execute $"set <A-{sym}>=\e{sym}" endfor enddef # для символов MapAlt(97, 122) # для цифр MapAlt(48, 57) # для символов верхнего регистра # FIXME: баг! какая-то из букв вызывает странное # поведение # MapAlt(65, 90) # фикс alt для readline в окне терминала {{{3 def FixTermAlt(): void var sym: string var tnum: number = 225 var tsym: string for c in range(97, 122) sym = nr2char(c) tsym = nr2char(tnum) execute $"tnoremap {tsym} " .. "<Esc>" .. sym ++tnum endfor enddef FixTermAlt() # подключение функциональных клавиш для tmux {{{3 if exists('$TMUX') execute $"set <xF1>=\e[@;*P" execute $"set <xF2>=\e[@;*Q" execute $"set <xF3>=\e[@;*R" execute $"set <xF4>=\e[@;*S" execute $"set <F5>=\e[15;*~" execute $"set <F6>=\e[17;*~" execute $"set <F7>=\e[18;*~" execute $"set <F8>=\e[19;*~" execute $"set <F9>=\e[20;*~" execute $"set <F10>=\e[21;*~" execute $"set <F11>=\e[23;*~" execute $"set <F12>=\e[24;*~" endif # }}}3 # }}}2 # Нормальный режим {{{2 # прокрутка мышью по одной строке {{{3 map <ScrollWheelUp> <C-Y> map <ScrollWheelDown> <C-E> # перерисовка экрана по <C-l> {{{3 nnoremap <silent> <C-L> :nohlsearch<Bar>diffupdate<CR><C-L> # перемещение по виртуальным строкам {{{3 nnoremap <Up> gk nnoremap <Down> gj # перемещение по вкладкам {{{3 nnoremap <Del> gt nnoremap <BS> gT # копировать часть строки по Y {{{3 nnoremap Y y$ nnoremap Й y$ # сохранить всё и выйти {{{3 nnoremap ZA :xall<CR> nnoremap ЗА :xall<CR> # закрыть всё без сохранения {{{3 nnoremap Z! :qall!<CR> nnoremap З! :qall!<CR> # сохранить файл {{{3 nnoremap <S-F10> :w<CR> # перезагрузка конфигурации {{{3 nnoremap <silent> <S-F12> :so $MYVIMRC<Bar>echow "config reloaded!"<CR> # информация о символе по ga без обрезки сообщения {{{3 def GA(): void var old_shm: string = &shortmess set shortmess-=T normal! ga &shortmess = old_shm enddef nnoremap ga <Cmd>call <SID>GA()<CR> # оператор перевода во всплывающем окне внешнего приложения по <Leader>t {{{3 def YaTr(type = ''): string if type == '' &operatorfunc = function('YaTr') return 'g@' endif var save = { clipboard: &clipboard, selection: &selection, register: getreginfo('"'), visual_marks: [getpos("'<"), getpos("'>")], } try set clipboard= selection=inclusive var commands = { line: "'[V']", char: "`[v`]", block: "gv", }[type] commands ..= 'y' execute 'silent noautocmd keepjumps normal! ' .. commands system($'am start -n "ru.maximoff.contextTranslate/.TranslateDialog" -a "android.intent.action.TRANSLATE" --es "android.intent.extra.TEXT" {shellescape(getreg('"'))} &>/dev/null') finally setreg('"', save.register) setpos("'<", save.visual_marks[0]) setpos("'>", save.visual_marks[1]) &clipboard = save.clipboard &selection = save.selection endtry return '' enddef nnoremap <expr> <Leader>t <SID>YaTr() xnoremap <expr> <Leader>t <SID>YaTr() nnoremap <expr> <Leader>tt <SID>YaTr() .. '_' # оператор сортировки по <Leader>s {{{3 def OpSort(type = ''): string if type == '' &operatorfunc = function('OpSort') return 'g@' endif var save = { clipboard: &clipboard, selection: &selection, register: getreginfo('"'), visual_marks: [getpos("'<"), getpos("'>")], } try set clipboard= selection=inclusive var commands = { char: "`[v`]", line: "'[V']", block: "gv", }[type] commands ..= 'y' execute 'silent noautocmd keepjumps normal! ' .. commands var slist: list<string> = getreg('"', 1, 1) def CharSort(str: string): void inputsave() var sep: string = input('Enter delim: ') inputrestore() redraw! str->split($'\V{escape(sep, '\')}') ->sort() ->join(sep) ->setreg('"') execute $"silent norm! gvp" enddef if type == 'char' if len(slist) == 1 CharSort(slist[0]) elseif len(slist) > 1 CharSort(join(slist)) execute "normal! a\<CR>\<Esc>" endif elseif type == 'line' if len(slist) > 1 var [_, s, _, _] = getpos("'[") var [_, e, _, _] = getpos("']") execute $':{s},{e}sort' elseif len(slist) == 1 CharSort(slist[0]) endif elseif type == 'block' if len(slist) > 1 var [_, s, _, _] = getpos("'[") var [_, e, _, _] = getpos("']") var snlist: list<list<any>> var bdict: dict<string> var idx: number = 0 for i in range(s, e) snlist[idx] = [slist[idx], i] bdict[i] = getline(i) ++idx endfor for [_, num] in sort(snlist) setline(s, bdict[num]) ++s endfor elseif len(slist) == 1 CharSort(slist[0]) endif endif finally setreg('"', save.register) setpos("'<", save.visual_marks[0]) setpos("'>", save.visual_marks[1]) &clipboard = save.clipboard &selection = save.selection endtry return '' enddef nnoremap <expr> <Leader>s <SID>OpSort() xnoremap <expr> <Leader>s <SID>OpSort() nnoremap <expr> <Leader>ss <SID>OpSort() .. '_' # открыть терминал {{{3 nnoremap <silent> <A-t> :term<CR> # последние файлы {{{3 nnoremap <silent> <F2> :browse oldfiles<CR> # }}}3 # }}}2 # Режим вставки {{{2 # прокрутка мышью по одной строке {{{3 imap <ScrollWheelUp> <C-X><C-Y> imap <ScrollWheelDown> <C-X><C-E> # перемещение по виртуальным строкам в окне дополнения по умолчанию {{{3 inoremap <expr> <Up> pumvisible() ? "\<lt>Up>" : "\<C-o>gk" inoremap <expr> <Down> pumvisible() ? "\<lt>Down>" : "\<C-o>gj" # автодополнение по табу {{{3 inoremap <Tab> <C-n> inoremap <S-Tab> <C-p> # автодополнение по текущему файлу {{{3 inoremap <A-n> <C-x><C-n> inoremap <A-p> <C-x><C-p> # автодополнение по синтаксису {{{3 inoremap <A-o> <C-x><C-o> # автодополнение целой строки {{{3 inoremap <A-l> <C-x><C-l> # автодополнение по словарю {{{3 inoremap <A-k> <C-x><C-k> # автодополнение по тезаурусу {{{3 inoremap <A-t> <C-x><C-t> # автодополнение по текущему и включённым файлам {{{3 inoremap <A-i> <C-x><C-i> # автодополнение по тегам {{{3 inoremap <A-a> <C-x><C-]> # автодополнение по именам файлов {{{3 inoremap <A-f> <C-x><C-f> # автодополнение по орфографии {{{3 inoremap <A-s> <C-x>s # автодополнение по объявлениям {{{3 inoremap <A-d> <C-x><C-d> # автодополнение команд Ex {{{3 inoremap <A-v> <C-x><C-v> # пользовательское автодополнение {{{3 inoremap <A-u> <C-x><C-u> # }}}3 # }}}2 # Командный режим {{{2 # вставить текущий каталог {{{3 cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h') .. '/' : '%%' # }}}3 # }}}2 # Режим выделения {{{2 # поиск выделенного по * и # {{{3 def Vstar(cmdtype: string): void var save_reg: string = @" normal! gvy @/ = $'\V{substitute(escape(@", cmdtype .. '\'), '\n', '\\n', 'g')}' @" = save_reg enddef xnoremap * :<C-U>call <SID>Vstar('/')<CR>/<C-r>=@/<CR><CR> xnoremap # :<C-U>call <SID>Vstar('?')<CR>/<C-r>=@/<CR><CR> # }}}3 # }}}2 # Режим терминала {{{2 # переход в нормальный режим терминала {{{3 tnoremap <C-z> <C-w>N # }}}3 # }}}2 # }}}1 # МЕНЮ {{{1 # Общее {{{2 # кодировка {{{3 anoremenu <silent> Общее.Кодировка.Выбор.UTF-8 :e ++enc=utf-8<CR> anoremenu <silent> Общее.Кодировка.Выбор.UTF-16 :e ++enc=utf-16<CR> anoremenu <silent> Общее.Кодировка.Выбор.UTF-16LE :e ++enc=utf-16le<CR> anoremenu <silent> Общее.Кодировка.Выбор.UTF-32 :e ++enc=utf-32<CR> anoremenu <silent> Общее.Кодировка.Выбор.UTF-32LE :e ++enc=utf-32le<CR> anoremenu <silent> Общее.Кодировка.Выбор.Win-1251 :e ++enc=cp1251<CR> anoremenu <silent> Общее.Кодировка.Выбор.Win-1252 :e ++enc=latin1<CR> anoremenu <silent> Общее.Кодировка.Выбор.KOI8-R :e ++enc=koi8-r<CR> anoremenu <silent> Общее.Кодировка.Выбор.CP866 :e ++enc=cp866<CR> anoremenu <silent> Общее.Кодировка.Конвертация.UTF-8 :setl fileencoding=utf-8<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.UTF-16 :setl fileencoding=utf-16<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.UTF-16LE :setl fileencoding=utf-16le<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.UTF-32 :setl fileencoding=utf-32<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.UTF-32LE :setl fileencoding=utf-32le<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.Win-1251 :setl fileencoding=cp1251<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.Win-1252 :setl fileencoding=latin1<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.KOI8-R :setl fileencoding=koi8-r<Bar>write<CR> anoremenu <silent> Общее.Кодировка.Конвертация.CP866 :setl fileencoding=cp866<Bar>write<CR> # формат файла (unix, dos, mac) {{{3 anoremenu <silent> Общее.Формат.Выбор.Unix :e ++ff=unix<CR> anoremenu <silent> Общее.Формат.Выбор.Windows :e ++ff=dos<CR> anoremenu <silent> Общее.Формат.Выбор.Mac :e ++ff=mac<CR> anoremenu <silent> Общее.Формат.Выбор.Binary :e ++bin<CR> anoremenu <silent> Общее.Формат.Конвертация.Unix setl fileformat=unix<Bar>write<CR> anoremenu <silent> Общее.Формат.Конвертация.Windows setl fileformat=dos<Bar>write<CR> anoremenu <silent> Общее.Формат.Конвертация.Mac setl fileformat=mac<Bar>write<CR> # орфография {{{3 anoremenu <silent> Общее.Орфография.Русский :setlocal spell spelllang=ru_ru<CR> anoremenu <silent> Общее.Орфография.Русский(ё) :setlocal spell spelllang=ru_yo<CR> anoremenu <silent> Общее.Орфография.Английский :setlocal spell spelllang=en_us<CR> anoremenu <silent> Общее.Орфография.Русский+Английский :setlocal spell spelllang=ru_yo,en_us<CR> # }}}3 map <silent> <F11> :emenu Общее.<Tab> # }}}2 #}}}1 # КОМАНДЫ {{{1 # редактирование конфигов {{{2 def EditConf(prg: string) var conf_path: string = $XDG_CONFIG_HOME if prg ==? "vim" conf_path = $MYVIMRC elseif prg ==? "bash" conf_path ..= "/bash/bashrc" elseif prg ==? "readline" conf_path ..= "/bash/inputrc" elseif prg ==? "profile" conf_path ..= "/profile" elseif prg ==? "vifm" conf_path ..= "/vifm/vifmrc" elseif prg ==? "tmux" conf_path ..= "/tmux/tmux.conf" elseif prg ==? "less" conf_path ..= "/less/lesskey" elseif prg ==? "dircolors" conf_path ..= "/dircolors/dircolors" endif if filereadable(conf_path) || isdirectory(conf_path) execute $'tabnew {conf_path}' else echoerr $'Не удалось открыть конфигурационный файл для {prg}' endif enddef command! -nargs=? Conf call EditConf(<q-args>) # }}}2 #}}}1 # АВТОКОМАНДЫ {{{1 # редактирование бинарных файлов {{{2 augroup Binary autocmd! autocmd BufReadPre *.mp3,*.jpg,*.png set binary autocmd BufReadPost *.mp3,*.jpg,*.png { if &binary execute "silent :%!xxd" set filetype=xxd redraw endif } autocmd BufWritePre *.mp3,*.jpg,*.png { if &binary var view = winsaveview() execute "silent :%!xxd -r" endif } autocmd BufWritePost *.mp3,*.jpg,*.png { if &binary execute "silent :%!xxd" set nomodified call winrestview(view) redraw endif } augroup END # автоматическое сохранение сессии {{{2 if !isdirectory($XDG_STATE_HOME .. "/vim/sessions") mkdir($XDG_STATE_HOME .. "/vim/sessions", "p") endif def g:SaveSession(): void if v:this_session != '' var name: string name = v:this_session->fnamemodify(':t:r') execute $'mksession! {v:this_session}' execute $'wviminfo! {$XDG_STATE_HOME}/vim/info/{name}.viminfo' elseif exists('$TMUX_SESSION') && fnamemodify(v:servername, ':t') ==? $TMUX_SESSION execute $'mksession! {$XDG_STATE_HOME}/vim/sessions/{$TMUX_SESSION}.vim' execute $'wviminfo! {$XDG_STATE_HOME}/vim/info/{$TMUX_SESSION}.viminfo' endif enddef # чтение файла viminfo в добавление к сессии def ReadViminfo(): void if v:this_session != '' var name: string var infofile: string name = v:this_session->fnamemodify(':t:r') infofile = $'{$XDG_STATE_HOME}/vim/info/{name}.viminfo' if filereadable(infofile) execute $'rviminfo! {infofile}' endif endif enddef autocmd_add([ { replace: true, group: 'Sessions', event: 'VimLeave', pattern: '*', cmd: 'call g:SaveSession()', }, { replace: true, group: 'Sessions', event: 'SessionLoadPost', pattern: '*', cmd: 'call ReadViminfo()', } ]) # }}}2 #}}}1 # ПЛАГИНЫ {{{1 # функция проверки и загрузки плагинов {{{2 def LoadPlug(plugin_name: string): number const plugin_path = globpath(&packpath, $'pack/*/opt/{plugin_name}') if !empty(plugin_path) execute $'packadd {plugin_name}' return 1 else return 0 endif enddef # Встроенные {{{2 # getscript {{{3 # отключение g:loaded_getscriptPlugin = 1 # vimball {{{3 # отключение g:loaded_vimballPlugin = 1 # cfilter {{{3 # фильтрует quickfix list packadd! cfilter # comment {{{3 # закомментировать/раскомментировать строки if LoadPlug('comment') # комментарий части строки (gC) nnoremap <silent> <expr> gC comment#Toggle() .. '$' endif # matchit {{{3 # переход к парным элементам packadd! matchit # helptoc {{{3 # оглавление для man, help и т. д. if LoadPlug('helptoc') # вызов меню nnoremap <silent> <C-F1> :HelpToc<CR> endif # nohlsearch {{{3 # автоматическое отключение подсветки результатов # поиска LoadPlug('nohlsearch') # hlyank {{{3 # подсветка скопированного текста LoadPlug('hlyank') # man {{{3 # просмотр манов if executable('man') runtime! ftplugin/man.vim endif # netrw {{{3 # файловый менеджер # отключить баннер g:netrw_banner = 0 # каталог netrw if !isdirectory($XDG_STATE_HOME .. "/vim/netrw") mkdir($XDG_STATE_HOME .. "/vim/netrw", "p") endif g:netrw_home = $XDG_STATE_HOME .. '/vim/netrw' # }}}3 # }}}2 # Скачанные {{{2 # vim-capslock {{{3 # переключение капса по <C-L> в нормальном режиме и режиме командной строки if LoadPlug('vim-capslock') cnoremap <C-L> <Plug>CapsLockToggle endif # indentLine {{{3 # отображение уровней отступов if LoadPlug('indentLine') # свой символ отступа g:indentLine_char = '|' # цвет фона g:indentLine_bgcolor_term = 8 # цвет символа g:indentLine_color_term = 238 # не показывать в указанных типах файлов g:indentLine_fileTypeExclude = ['text', 'man', 'jbt'] # не показывать в указанных типах буфера g:indentLine_bufTypeExclude = ['help', 'terminal'] endif # surround {{{3 # различное обёртывание текстовых объектов if LoadPlug('surround') # переназначения ys на s nnoremap s <Plug>Ysurround nnoremap S <Plug>YSurround nnoremap ss <Plug>Yssurround nnoremap SS <Plug>YSsurround nnoremap Ss <Plug>YSsurround # обёртывание разными кавычками g:surround_187 = "«\r»" g:surround_171 = "«\r»" g:surround_8220 = "„\r“" endif # unimpaired {{{3 # перемещения, переключение опций и т. д. LoadPlug('unimpaired') # repeat {{{3 # повторения команд для плагинов LoadPlug('repeat') # FastFold {{{3 # ускорение складок в режиме вставки if LoadPlug('FastFold') # обновление складок nmap zuz <Plug>(FastFoldUpdate) # не обновлять при командах открытия/закрытия g:fastfold_fold_command_suffixes = [] # не обновлять при командах движения g:fastfold_fold_movement_commands = [] # обновлять при сохранении g:fastfold_savehook = 1 endif # vifm.vim {{{3 # интеграция с vifm if LoadPlug('vifm.vim') # открывать файлы в новых вкладках nnoremap <A-d> :TabVifm<CR> # не работает g:vifm_embed_split = 1 # менять рабочий каталог на положение текущего файла g:vifm_embed_cwd = 1 # удалять буферы, если файлы были удалены через vifm g:vifm_drop_gone_buffers = 1 endif # endwise {{{3 # автодополнение условных конструкций, циклов... LoadPlug('endwise') # SyntaxAttr {{{3 # отображение текущей группы подсветки if LoadPlug('SyntaxAttr') nnoremap <A-a> <Cmd>call SyntaxAttr()<CR> endif # vim-textobj-user {{{3 if LoadPlug('vim-textobj-user') :: endif # info {{{3 LoadPlug('vinfo') # lsp {{{3 LoadPlug('lsp') # fugitive {{{3 LoadPlug('fugitive') # }}}3 # }}}2 # Мои плагины {{{2 # jbak2exp {{{3 # LoadPlug('vim-jbak') # bash syntax {{{3 # LoadPlug('vim-bash-syntax') # }}}3 # }}}2 #}}}1 # СЕРВЕР {{{1 if v:servername == '' var name: string if exists('$TMUX_SESSION') name = $TMUX_SESSION else name = 'vim' endif remote_startserver(toupper(name)) endif #}}}1 # vim: fdm=marker