diff options
| l--------- | .config/nvim/autoload | 1 | ||||
| -rw-r--r-- | .config/nvim/init.lua | 1816 | ||||
| -rw-r--r-- | .config/nvim/init.vim | 1880 | ||||
| l--------- | .config/nvim/plugged | 1 |
4 files changed, 1816 insertions, 1882 deletions
diff --git a/.config/nvim/autoload b/.config/nvim/autoload deleted file mode 120000 index 2d31eb7..0000000 --- a/.config/nvim/autoload +++ /dev/null @@ -1 +0,0 @@ -../vim/autoload
\ No newline at end of file diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..b8b9225 --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,1816 @@ +--[==========================================================================[-- +-- -- +-- _ __ _ _ _ _ -- +-- _ ____ _(_)_ __ ___ / / (_)_ __ (_) |_ | |_ _ __ _ -- +-- | '_ \ \ / / | '_ ` _ \ / / | | '_ \| | __| | | | | |/ _` | -- +-- | | | \ V /| | | | | | | / / | | | | | | |_ _| | |_| | (_| | -- +-- |_| |_|\_/ |_|_| |_| |_| /_/ |_|_| |_|_|\__(_)_|\__,_|\__,_| -- +-- -- +--]==========================================================================]-- + + + +-- Global settings {{{1 + +-- Global constants {{{2 + +local my_env = {} + +if vim.fn.has('unix') then + my_env.os = 'unix' +elseif vim.fn.has('mac') then + my_env.os = 'mac' +elseif vim.fn.has('wsl') then + my_env.os = 'wsl' +elseif vim.fn.has('win32') or vim.fn.has('win64') then + my_env.os = 'windows' +else + my_env.os = 'unknown' +end + +my_env.config_home = vim.env.XDG_CONFIG_HOME or vim.env.HOME .. '/.config' +my_env.cache_home = vim.env.XDG_CACHE_HOME or vim.env.HOME .. '/.cache' +my_env.data_home = vim.env.XDG_DATA_HOME or vim.env.HOME .. '/.local/share' + +my_env.config_dir = my_env.config_home .. '/nvim' +my_env.cache_dir = my_env.cache_home .. '/nvim' +my_env.data_dir = my_env.data_home .. '/nvim' + +my_env.my_dir = my_env.config_dir .. '/my' +my_env.yankround_dir = my_env.data_dir .. '/yankround' +my_env.skk_dir = my_env.config_home .. '/skk' + +for k, v in pairs(my_env) do + if vim.endswith(k, '_dir') and not vim.fn.isdirectory(v) then + vim.fn.mkdir(v, 'p') + end +end + + + + +-- The autogroup used in .vimrc {{{2 + +vim.cmd([[ +augroup Vimrc + autocmd! +augroup END +]]) + + +-- Note: |:autocmd| does not accept |-bar|. + +local vimrc = {} +vimrc.autocmd_callbacks = {} +_G.vimrc = vimrc + +function vimrc.autocmd(event, filter, callback) + local callback_id = #vimrc.autocmd_callbacks + 1 + vimrc.autocmd_callbacks[callback_id] = callback + vim.cmd(('autocmd Vimrc %s %s lua vimrc.autocmd_callbacks[%d]()'):format( + event, + filter, + callback_id)) +end + + + +-- Language {{{2 + +-- Disable L10N. + +vim.cmd('language messages C') +vim.cmd('language time C') + + + + + +-- Options {{{1 + +-- * Use |:set|, not |:setglobal|. +-- |:setglobal| does not set local options, so options are not set in +-- the starting buffer you specified as commandline arguments like +-- "$ vim ~/.vimrc". + +-- Moving around, searching and patterns {{{2 + +vim.o.wrapscan = false +vim.o.ignorecase = true +vim.o.smartcase = true + + + +-- Displaying text {{{2 + +vim.o.scrolloff = 7 +vim.o.linebreak = true +vim.o.breakindent = true +vim.o.breakindentopt = vim.o.breakindentopt .. ',sbr' +vim.o.showbreak = '> ' +vim.o.sidescrolloff = 20 +vim.o.fillchars = 'stl: ,stlnc: ,vert: ,fold: ,diff: ' +vim.o.cmdheight = 2 +vim.o.list = true +-- \u00ac \xc2\xac +-- \u25b8 \xe2\x96\xb8 +-- \u00b7 \xc2\xb7 +-- \u00bb \xc2\xbb +-- \u00ab \xc2\xab +vim.o.listchars = 'eol:\xc2\xac,tab:\xe2\x96\xb8 ,trail:\xc2\xb7,extends:\xc2\xbb,precedes:\xc2\xab' +vim.o.concealcursor = 'cnv' + + + +-- Syntax, highlighting and spelling {{{2 + +vim.o.background = 'dark' +vim.o.synmaxcol = 500 +vim.o.hlsearch = true +-- Execute nohlsearch to avoid highlighting last searched pattern when reloading +-- .vimrc. +vim.cmd('nohlsearch') +vim.o.termguicolors = true +vim.o.colorcolumn = '+1' + + +-- Multiple windows {{{2 + +vim.o.winminheight = 0 +vim.o.hidden = true +vim.o.switchbuf = 'usetab' + + + +-- Multiple tabpages {{{2 + +vim.o.showtabline = 2 + + + +-- Terminal {{{2 + +vim.o.title = false + + + +-- Using the mouse {{{2 + +vim.o.mouse = '' + + + +-- Messages and info {{{2 + +vim.o.shortmess = vim.o.shortmess .. 'asIc' +vim.o.showmode = false +vim.o.report = 999 +vim.o.confirm = true + + + +-- Selecting text {{{2 + +vim.o.clipboard = 'unnamed' + + + +-- Editing text {{{2 + +vim.o.undofile = true +vim.o.textwidth = 0 +vim.cmd('set completeopt-=preview') +vim.o.pumheight = 10 +vim.o.matchpairs = vim.o.matchpairs .. ',<:>' +vim.o.joinspaces = false +vim.o.nrformats = vim.o.nrformats .. ',unsigned' + + + +-- Tabs and indenting {{{2 +-- Note: you should also set them for each file types. +-- These following settings are global, used for unknown file types. + +vim.o.tabstop = 4 +vim.o.shiftwidth = 4 +vim.o.softtabstop = 4 +vim.o.expandtab = true +vim.o.smartindent = true +vim.o.copyindent = true +vim.o.preserveindent = true + + + +-- Folding {{{2 + +vim.o.foldlevelstart = 0 +vim.o.foldopen = vim.o.foldopen .. ',insert' +vim.o.foldmethod = 'marker' + + + +-- Diff mode {{{2 + +vim.o.diffopt = vim.o.diffopt .. ',vertical' +vim.o.diffopt = vim.o.diffopt .. ',foldcolumn:3' + + + +-- Mapping {{{2 + +vim.o.maxmapdepth = 10 +vim.o.timeout = false + + + +-- Reading and writing files {{{2 + +vim.o.fixendofline = false +-- Note: if 'fileformat' is empty, the first item of 'fileformats' is used. +vim.o.fileformats = 'unix,dos' +-- Note: these settings make one backup. If you want more backups, see +-- |'backupext'|. +vim.o.backup = true +vim.o.autowrite = true + + + +-- Command line editing {{{2 +vim.o.wildignore = vim.o.wildignore .. ',*.o,*.obj,*.lib' +vim.o.wildignorecase = true + + + +-- Executing external commands {{{2 + +vim.o.shell = 'zsh' +vim.o.keywordprg = '' + + + +-- Encoding {{{2 + +-- Note: if 'fileencoding' is empty, 'encoding' is used. +vim.o.fileencodings = 'utf-8,cp932,euc-jp' + + + +-- Misc. {{{2 + +vim.o.sessionoptions = vim.o.sessionoptions .. ',localoptions' +vim.o.sessionoptions = vim.o.sessionoptions .. ',resize' +vim.o.sessionoptions = vim.o.sessionoptions .. ',winpos' + + + +-- Installed plugins {{{1 + +local paq = require('paq') +paq({ + -- Text editing {{{2 + -- IME {{{3 + -- SKK (Simple Kana to Kanji conversion program) for Vim. + 'vim-skk/eskk.vim', + -- Operators {{{3 + -- Support for user-defined operators. + 'kana/vim-operator-user', + -- Extract expression and make assingment statement. + 'tek/vim-operator-assign', + -- Replace text without updating registers. + 'kana/vim-operator-replace', + -- Reverse text. + 'tyru/operator-reverse.vim', + -- Search in a specific region. + 'osyo-manga/vim-operator-search', + -- Shiffle text. + 'pekepeke/vim-operator-shuffle', + -- Sort text characterwise and linewise. + 'emonkak/vim-operator-sort', + -- Super surround. + 'machakann/vim-sandwich', + -- Non-operators {{{3 + -- Comment out. + 'tyru/caw.vim', + -- Align text. + 'junegunn/vim-easy-align', + -- Text objects {{{2 + -- Support for user-defined text objects. + 'kana/vim-textobj-user', + -- Text object for blockwise. + 'osyo-manga/vim-textobj-blockwise', + -- Text object for comment. + 'thinca/vim-textobj-comment', + -- Text object for continuous line. + 'rhysd/vim-textobj-continuous-line', + -- Text object for entire file. + 'kana/vim-textobj-entire', + -- Text object for function. + 'kana/vim-textobj-function', + -- Text object for indent. + 'kana/vim-textobj-indent', + -- Text object for last inserted text. + 'rhysd/vim-textobj-lastinserted', + -- Text object for last pasted text. + 'gilligan/textobj-lastpaste', + -- Text object for last searched pattern. + 'kana/vim-textobj-lastpat', + -- Text object for line. + 'kana/vim-textobj-line', + -- Text object for parameter. + 'sgur/vim-textobj-parameter', + -- Text object for space. + 'saihoooooooo/vim-textobj-space', + -- Text object for syntax. + 'kana/vim-textobj-syntax', + -- Text object for URL. + 'mattn/vim-textobj-url', + -- Text object for words in words. + 'h1mesuke/textobj-wiw', + -- Search {{{2 + -- Extend * and #. + 'haya14busa/vim-asterisk', + -- Extend incremental search. + 'haya14busa/incsearch.vim', + -- NOTE: it is a fork version of jremmen/vim-ripgrep + -- Integration with ripgrep, fast alternative of grep command. + 'nsfisis/vim-ripgrep', + -- Files {{{2 + -- Switch to related files. + 'kana/vim-altr', + -- Fast Fuzzy Finder. + 'ctrlpvim/ctrlp.vim', + -- CtrlP's matcher by builtin `matchfuzzy()`. + 'mattn/ctrlp-matchfuzzy', + -- Filer for minimalists. + 'justinmk/vim-dirvish', + -- Appearance {{{2 + -- Show highlight. + 'cocopon/colorswatch.vim', + -- NOTE: it is a fork of godlygeek/csapprox + -- Make gui-only color schemes 256colors-compatible. + 'nsfisis/csapprox', + -- Makes folding text cool. + 'LeafCage/foldCC.vim', + -- Show indent. + 'Yggdroot/indentLine', + -- Cool status line. + 'itchyny/lightline.vim', + -- Highlight matched parentheses. + 'itchyny/vim-parenmatch', + -- Highlight specified words. + 't9md/vim-quickhl', + -- Filetypes {{{2 + -- Syntax {{{3 + -- HCL + 'b4b4r07/vim-hcl', + -- JavaScript + 'pangloss/vim-javascript', + -- JSON5 + 'GutenYe/json5.vim', + -- MoonScript + 'leafo/moonscript-vim', + -- Nginx conf + 'chr4/nginx.vim', + -- Rust + 'rust-lang/rust.vim', + -- TOML + 'cespare/vim-toml', + -- TypeScript + 'leafgarland/typescript-vim', + -- Tools {{{3 + -- C/C++: clang-format + 'rhysd/vim-clang-format', + -- Python: autopep8 + 'tell-k/vim-autopep8', + -- QoL {{{2 + -- If a directory is missing, make it automatically. + 'mopp/autodirmake.vim', + -- Capture the output of a command. + 'tyru/capture.vim', + -- Write git commit message. + 'rhysd/committia.vim', + -- Motion on speed. + 'easymotion/vim-easymotion', + -- Integration with EditorConfig (https://editorconfig.org) + 'editorconfig/editorconfig-vim', + -- Extend J. + 'osyo-manga/vim-jplus', + -- Improve behaviors of I, A and gI in Blockwise-Visual mode. + 'kana/vim-niceblock', + -- Edit QuickFix and reflect to original buffers. + 'thinca/vim-qfreplace', + -- Run anything. + 'thinca/vim-quickrun', + -- Extend dot-repeat. + 'tpope/vim-repeat', + -- Split one line format and Join multiline format. + 'AndrewRadev/splitjoin.vim', + -- Introduce user-defined mode. + 'kana/vim-submode', + -- Swap arguments. + 'machakann/vim-swap', + -- Adjust window size. + 'rhysd/vim-window-adjuster', + -- Remember yank history and paste them. + 'LeafCage/yankround.vim', + -- }}} +}) + +vim.o.runtimepath = vim.o.runtimepath .. ',' .. my_env.my_dir + + +-- Utilities {{{1 + +function vimrc.hi(group, attributes) + vim.cmd(('highlight! %s %s'):format(group, attributes)) +end + + +function vimrc.hi_link(from, to) + vim.cmd(('highlight! link %s %s'):format(from, to)) +end + + +function vimrc.map(mode, lhs, rhs, opts) + if opts == nil then + opts = {} + end + if opts.noremap == nil then + opts.noremap = true + end + vim.api.nvim_set_keymap( + mode, + lhs, + rhs, + opts) +end + + +vimrc.map_callbacks = {} + +function vimrc.map_expr(mode, lhs, rhs, opts) + if opts == nil then + opts = {} + end + if opts.noremap == nil then + opts.noremap = true + end + opts.expr = true + local callback_id = #vimrc.map_callbacks + 1 + vimrc.map_callbacks[callback_id] = rhs + vim.api.nvim_set_keymap( + mode, + lhs, + ('v:lua.vimrc.map_callbacks[%d]()'):format(callback_id), + opts) +end + + +function vimrc.map_cmd(mode, lhs, rhs, opts) + if opts == nil then + opts = {} + end + opts.noremap = true + opts.silent = true + vim.api.nvim_set_keymap( + mode, + lhs, + (':<C-u>%s<CR>'):format(rhs), + opts) +end + + +function vimrc.map_plug(mode, lhs, rhs, opts) + if opts == nil then + opts = {} + end + vim.api.nvim_set_keymap( + mode, + lhs, + '<Plug>' .. rhs, + opts) +end + + +-- Wrapper of |getchar()|. +function vimrc.getchar() + local ch = vim.fn.getchar() + while ch == "\\<CursorHold>" do + ch = vim.fn.getchar() + end + return type(ch) == 'number' and vim.fn.nr2char(ch) or ch +end + + +-- Wrapper of |:echo| and |:echohl|. +function vimrc.echo(message, hl) + if not hl then + hl = 'None' + end + vim.cmd('redraw') + vim.cmd('echohl ' .. hl) + vim.cmd('echo "' .. message .. '"') + vim.cmd('echohl None') +end + + +-- Wrapper of |getchar()|. +function vimrc.getchar_with_prompt(prompt) + vimrc.echo(prompt, 'Question') + return vimrc.getchar() +end + + +-- Wrapper of |input()|. +-- Only when it is used in a mapping, |inputsave()| and |inputstore()| are +-- required. +function vimrc.input(prompt) + vim.fn.inputsave() + local result = vim.fn.input(prompt) + vim.fn.inputrestore() + return result +end + + +function vimrc.term(s) + return vim.api.nvim_replace_termcodes(s, true, true, true) +end + + + +-- Autocommands {{{1 + +-- Auto-resize windows when Vim is resized. +vimrc.autocmd('VimResized', '*', function() + vim.cmd('wincmd =') +end) + + +-- Calculate 'numberwidth' to fit file size. +-- Note: extra 2 is the room of left and right spaces. +vimrc.autocmd('BufEnter,WinEnter,BufWinEnter', '*', function() + vim.wo.numberwidth = #tostring(vim.fn.line('$')) + 2 +end) + + +-- Jump to the last cursor position when you open a file. +vimrc.autocmd('BufRead', '*', function() + if 0 < vim.fn.line("'\"") and vim.fn.line("'\"") <= vim.fn.line('$') and + not vim.o.filetype:match('commit') and not vim.o.filetype:match('rebase') + then + vim.cmd('normal g`"') + end +end) + + +-- Syntax highlight for .vimrc {{{2 + +vimrc.autocmd('ColorScheme', 'ocean', function() + if vim.o.background ~= 'dark' then + return + end + + -- yankround + vimrc.hi_link('YankRoundRegion', 'DiffChange') + + -- sandwich + vimrc.hi_link('OperatorSandwichBuns', 'DiffChange') + vimrc.hi_link('OperatorSandwichStuff', 'DiffChange') + vimrc.hi_link('OperatorSandwichDelete', 'DiffChange') + vimrc.hi_link('OperatorSandwichAdd', 'OperatorSandwichBuns') + + -- easymotion + vimrc.hi('EasyMotionShade', 'guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE') + vimrc.hi('EasyMotionTarget', 'guifg=#ff7100 guibg=NONE gui=underline cterm=underline') + vimrc.hi_link('EasyMotionMoveHL', 'IncSearch') +end) + + +-- Mappings {{{1 + +-- Note: |:noremap| defines mappings in |Normal|, |Visual|, |Operator-Pending| +-- and |Select| mode. Because I don't use |Select| mode, I use |:noremap| as +-- substitute of |:nnoremap|, |:xnoremap| and |:onoremap| for simplicity. + + +-- Fix the search direction. {{{2 + +vimrc.map('', 'n', "v:searchforward ? 'n' : 'N'", { expr = true }) +vimrc.map('', 'N', "v:searchforward ? 'N' : 'n'", { expr = true }) + +vimrc.map('', 'gn', "v:searchforward ? 'gn' : 'gN'", { expr = true }) +vimrc.map('', 'gN', "v:searchforward ? 'gN' : 'gn'", { expr = true }) + + + +vimrc.map('n', '&', ':%&&<CR>', { silent = true }) +vimrc.map('x', '&', ':%&&<CR>', { silent = true }) + + + +-- Registers and macros. {{{2 + + +-- Access an resister in the same way in Insert and Commandline mode. +vimrc.map('n', '<C-r>', '"') +vimrc.map('x', '<C-r>', '"') + + + +vimrc.map('n', '@j', 'j.') +vimrc.map('n', '@k', 'k.') +vimrc.map('n', '@n', 'n.') +vimrc.map('n', '@N', 'N.') + +-- Repeat the last executed macro as many times as possible. +-- a => all +vimrc.map('n', '@a', '9999@@') +vimrc.map('n', '@a', '9999@@') + + +-- Execute the last executed macro again. +vimrc.map('n', '`', '@@') + + + +-- Emacs like key mappings in Insert and CommandLine mode. {{{2 + +vimrc.map('i', '<C-d>', '<Del>') + +-- Go elsewhere without deviding the undo history. +vimrc.map_expr('i', '<C-a>', function() + local repeat_ = vim.fn['repeat'] + local line = vim.fn.getline('.') + local cursor_col = vim.fn.col('.') + local space_idx = vim.regex('^\\S'):match_str(line) + + if cursor_col == space_idx + 1 then + return repeat_("\\<C-g>U\\<Left>", cursor_col - 1) + else + if cursor_col < space_idx then + return repeat_("\\<C-g>U\\<Right>", space_idx - cursor_col + 1) + else + return repeat_("\\<C-g>U\\<Left>", cursor_col - 1 - space_idx) + end + end +end) +vimrc.map('i', '<C-e>', "repeat('<C-g>U<Right>', col('$') - col('.'))", { expr = true }) +vimrc.map('i', '<C-b>', '<C-g>U<Left>') +vimrc.map('i', '<C-f>', '<C-g>U<Right>') + +-- Delete something deviding the undo history. +vimrc.map('i', '<C-u>', '<C-g>u<C-u>') +vimrc.map('i', '<C-w>', '<C-g>u<C-w>') + +vimrc.map('c', '<C-a>', '<Home>') +vimrc.map('c', '<C-e>', '<End>') +vimrc.map('c', '<C-f>', '<Right>') +vimrc.map('c', '<C-b>', '<Left>') +vimrc.map('c', '<C-n>', '<Down>') +vimrc.map('c', '<C-p>', '<Up>') +vimrc.map('c', '<C-d>', '<Del>') + +vimrc.map('c', '<Left>', '<Nop>') +vimrc.map('i', '<Left>', '<Nop>') +vimrc.map('c', '<Right>', '<Nop>') +vimrc.map('i', '<Right>', '<Nop>') + + + +vimrc.map_expr('n', 'gA', function() + local line = vim.fn.getline('.') + if vim.endswith(line, ';;') then -- for OCaml + return 'A\\<C-g>U\\<Left>\\<C-g>U\\<Left>' + elseif vim.regex('[,;)]$'):match_str(line) then + return 'A\\<C-g>U\\<Left>' + else + return 'A' + end +end) + + + +-- QuickFix or location list. {{{2 + +vimrc.map_cmd('n', 'bb', 'cc') + +vimrc.map('n', 'bn', ':<C-u><C-r>=v:count1<CR>cnext<CR>', { silent = true }) +vimrc.map('n', 'bp', ':<C-u><C-r>=v:count1<CR>cprevious<CR>', { silent = true }) + +vimrc.map_cmd('n', 'bf', 'cfirst') +vimrc.map_cmd('n', 'bl', 'clast') + +vimrc.map_cmd('n', 'bS', 'colder') +vimrc.map_cmd('n', 'bs', 'cnewer') + + + +-- Operators {{{2 + +-- Throw deleted text into the black hole register ("_). +vimrc.map('n', 'c', '"_c') +vimrc.map('x', 'c', '"_c') +vimrc.map('n', 'C', '"_C') +vimrc.map('x', 'C', '"_C') + + +vimrc.map('', 'g=', '=') + + +vimrc.map('', 'ml', 'gu') +vimrc.map('', 'mu', 'gU') + +vimrc.map('', 'gu', '<Nop>') +vimrc.map('', 'gU', '<Nop>') +vimrc.map('x', 'u', '<Nop>') +vimrc.map('x', 'U', '<Nop>') + + +vimrc.map('x', 'x', '"_x') + + +vimrc.map('n', 'Y', 'y$') +-- In Blockwise-Visual mode, select text linewise. +-- By default, select text characterwise, neither blockwise nor linewise. +vimrc.map('x', 'Y', "mode() ==# 'V' ? 'y' : 'Vy'", { expr = true }) + + + +-- Swap the keys entering Replace mode and Visual-Replace mode. +vimrc.map('n', 'R', 'gR') +vimrc.map('n', 'gR', 'R') +vimrc.map('n', 'r', 'gr') +vimrc.map('n', 'gr', 'r') + + +vimrc.map('n', 'U', '<C-r>') + + + + +-- Motions {{{2 + +vimrc.map('', 'H', '^') +vimrc.map('', 'L', '$') +vimrc.map('', 'M', '%') + +vimrc.map('', 'gw', 'b') +vimrc.map('', 'gW', 'B') + +vimrc.map('', 'k', 'gk') +vimrc.map('', 'j', 'gj') +vimrc.map('', 'gk', 'k') +vimrc.map('', 'gj', 'j') + +vimrc.map('n', 'gff', 'gF') + + + +-- Tabpages and windows. {{{2 + +vimrc.fn = {} + +function vimrc.fn.move_current_window_to_tabpage() + if vim.fn.winnr('$') == 1 then + -- Leave the current window and open it in a new tabpage. + -- Because :wincmd T fails when the current tabpage has only one window. + vim.cmd('tab split') + else + -- Close the current window and re-open it in a new tabpage. + vim.cmd('wincmd T') + end +end + + +function vimrc.fn.bdelete_bang_with_confirm() + if string.lower(vimrc.getchar_with_prompt('Delete? (y/n) ')) == 'y' then + vim.cmd('bdelete!') + else + vimrc.echo('Canceled') + end +end + + +function vimrc.fn.choose_window_interactively() + local indicators = { + 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', + '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + } + + -- List normal windows up to 20. + local wins = {} + for winnr = 1, vim.fn.winnr('$') do + if winnr ~= vim.fn.winnr() and vim.fn.win_gettype(winnr) == '' then + wins[#wins+1] = vim.fn.win_getid(winnr) + end + end + if #indicators < #wins then + for i = #indicators+1, #wins do + wins[i] = nil + end + end + + -- Handle special cases. + if #wins == 0 then + return + end + if #wins == 1 then + if wins[1] == vim.fn.win_getid() then + vim.fn.win_gotoid(wins[2]) + else + vim.fn.win_gotoid(wins[1]) + end + return + end + + -- Show popups. + local popups = {} + for i = 1, #wins do + local winid = wins[i] + local indicator = indicators[i] + local buf_id = vim.api.nvim_create_buf(false, true) + vim.api.nvim_buf_set_lines(buf_id, 0, -1, true, { ' ' .. indicator .. ' ' }) + local popup = vim.api.nvim_open_win( + buf_id, + false, + { + relative = 'win', + win = winid, + row = (vim.fn.winheight(winid) - 5) / 2, + col = (vim.fn.winwidth(winid) - 9) / 2, + width = 5, + height = 1, + focusable = false, + style = 'minimal', + border = 'solid', + noautocmd = true, + }) + popups[#popups+1] = { + winid = popup, + indicator = indicator, + target_winid = winid, + } + end + + -- Prompt + local result = vimrc.getchar_with_prompt('Select window: ') + + -- Jump + local jump_target = -1 + for i, popup in ipairs(popups) do + if string.upper(result) == popup.indicator then + jump_target = popup.target_winid + end + end + if jump_target ~= -1 then + vim.fn.win_gotoid(jump_target) + end + + -- Close popups + for i, popup in ipairs(popups) do + vim.api.nvim_win_close(popup.winid, true) + end +end + + +vimrc.map('n', 'tt', ':<C-u>tabnew<CR>', { silent = true }) +vimrc.map('n', 'tT', ':<C-u>call v:lua.vimrc.fn.move_current_window_to_tabpage()<CR>', { silent = true }) + +vimrc.map('n', 'tn', ":<C-u><C-r>=(tabpagenr() + v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR>", { silent = true }) +vimrc.map('n', 'tp', ":<C-u><C-r>=(tabpagenr('$') * 10 + tabpagenr() - v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR>", { silent = true }) + +vimrc.map('n', 'tN', ':<C-u>tabmove +<CR>', { silent = true }) +vimrc.map('n', 'tP', ':<C-u>tabmove -<CR>', { silent = true }) + +vimrc.map('n', 'tsh', ':<C-u>leftabove vsplit<CR>', { silent = true }) +vimrc.map('n', 'tsj', ':<C-u>rightbelow split<CR>', { silent = true }) +vimrc.map('n', 'tsk', ':<C-u>leftabove split<CR>', { silent = true }) +vimrc.map('n', 'tsl', ':<C-u>rightbelow vsplit<CR>', { silent = true }) + +vimrc.map('n', 'tsH', ':<C-u>topleft vsplit<CR>', { silent = true }) +vimrc.map('n', 'tsJ', ':<C-u>botright split<CR>', { silent = true }) +vimrc.map('n', 'tsK', ':<C-u>topleft split<CR>', { silent = true }) +vimrc.map('n', 'tsL', ':<C-u>botright vsplit<CR>', { silent = true }) + +vimrc.map('n', 'twh', ':<C-u>leftabove vnew<CR>', { silent = true }) +vimrc.map('n', 'twj', ':<C-u>rightbelow new<CR>', { silent = true }) +vimrc.map('n', 'twk', ':<C-u>leftabove new<CR>', { silent = true }) +vimrc.map('n', 'twl', ':<C-u>rightbelow vnew<CR>', { silent = true }) + +vimrc.map('n', 'twH', ':<C-u>topleft vnew<CR>', { silent = true }) +vimrc.map('n', 'twJ', ':<C-u>botright new<CR>', { silent = true }) +vimrc.map('n', 'twK', ':<C-u>topleft new<CR>', { silent = true }) +vimrc.map('n', 'twL', ':<C-u>botright vnew<CR>', { silent = true }) + +vimrc.map('n', 'th', '<C-w>h') +vimrc.map('n', 'tj', '<C-w>j') +vimrc.map('n', 'tk', '<C-w>k') +vimrc.map('n', 'tl', '<C-w>l') + +vimrc.map('n', 'tH', '<C-w>H') +vimrc.map('n', 'tJ', '<C-w>J') +vimrc.map('n', 'tK', '<C-w>K') +vimrc.map('n', 'tL', '<C-w>L') + +vimrc.map('n', 'tx', '<C-w>x') + +-- r => manual resize. +-- R => automatic resize. +vimrc.map('n', 'tRH', '<C-w>_') +vimrc.map('n', 'tRW', '<C-w><Bar>') +vimrc.map('n', 'tRR', '<C-w>_<C-w><Bar>') + +vimrc.map('n', 't=', '<C-w>=') + +vimrc.map('n', 'tq', ':<C-u>bdelete<CR>', { silent = true }) +vimrc.map('n', 'tQ', ':<C-u>call v:lua.vimrc.fn.bdelete_bang_with_confirm()<CR>', { silent = true }) + +vimrc.map('n', 'tc', '<C-w>c') + +vimrc.map('n', 'to', '<C-w>o') +vimrc.map('n', 'tO', ':<C-u>tabonly<CR>', { silent = true }) + +vimrc.map('n', 'tg', ':<C-u>call v:lua.vimrc.fn.choose_window_interactively()<CR>', { silent = true }) + + + +function vimrc.fn.smart_open(command) + local modifiers + if vim.fn.winwidth(vim.fn.winnr()) < 150 then + modifiers = 'topleft' + else + modifiers = 'vertical botright' + end + + vim.cmd(([[ + try + %s %s + let g:__ok = v:true + catch + echohl Error + echo v:exception + echohl None + let g:__ok = v:false + endtry + ]]):format(modifiers, command)) + if not vim.g.__ok then + return + end + + if vim.o.filetype == 'help' then + if vim.bo.textwidth > 0 then + vim.cmd(('vertical resize %d'):format(vim.bo.textwidth)) + end + -- Move the cursor to the beginning of the line as help tags are often + -- right-justfied. + vim.fn.cursor( + 0 --[[ stay in the current line ]], + 1 --[[ move to the beginning of the line ]]) + end +end + + +vim.cmd([[ +command! -nargs=+ -complete=command + \ SmartOpen + \ call v:lua.vimrc.fn.smart_open(<q-args>) +]]) + + + + +-- Increment/decrement numbers {{{2 + +-- nnoremap + <C-a> +-- nnoremap - <C-x> +-- xnoremap + <C-a> +-- xnoremap - <C-x> +-- xnoremap g+ g<C-a> +-- xnoremap g- g<C-x> + + + +-- Disable unuseful or dangerous mappings. {{{2 + +-- Disable Select mode. +vimrc.map('n', 'gh', '<Nop>') +vimrc.map('n', 'gH', '<Nop>') +vimrc.map('n', 'g<C-h>', '<Nop>') + +-- Disable Ex mode. +vimrc.map('n', 'Q', '<Nop>') +vimrc.map('n', 'gQ', '<Nop>') + +vimrc.map('n', 'ZZ', '<Nop>') +vimrc.map('n', 'ZQ', '<Nop>') + + +-- Help {{{2 + +-- Search help. +vimrc.map('n', '<C-h>', ':<C-u>SmartOpen help<Space>') + + + +-- For writing Vim script. {{{2 + +vimrc.map('n', 'XV', ':<C-u>tabedit $MYVIMRC<CR>', { silent = true }) + +-- See |numbered-function|. +vimrc.map('n', 'XF', ':<C-u>function {<C-r>=v:count<CR>}<CR>', { silent = true }) + +vimrc.map('n', 'XM', ':<C-u>messages<CR>', { silent = true }) + + + + +-- Misc. {{{2 + +vimrc.map('o', 'gv', ':<C-u>normal! gv<CR>', { silent = true }) + +-- Swap : and ;. +vimrc.map('n', ';', ':') +vimrc.map('n', ':', ';') +vimrc.map('x', ';', ':') +vimrc.map('x', ':', ';') +vimrc.map('n', '@;', '@:') +vimrc.map('x', '@;', '@:') +vimrc.map('!', '<C-r>;', '<C-r>:') + + +-- Since <ESC> may be mapped to something else somewhere, it should be :map, not +-- :noremap. +vimrc.map('!', 'jk', '<ESC>', { noremap = false }) + + + +vimrc.map('n', '<C-c>', ':<C-u>nohlsearch<CR>', { silent = true }) + + + +function vimrc.map_callbacks.insert_blank_line(offset) + for i = 1, vim.v.count1 do + vim.fn.append(vim.fn.line('.') - offset, '') + end +end + +vimrc.map('n', '<Plug>(my-insert-blank-lines-after)', + 'call v:lua.vimrc.map_callbacks.insert_blank_line(0)') +vimrc.map('n', '<Plug>(my-insert-blank-lines-before)', + 'call v:lua.vimrc.map_callbacks.insert_blank_line(1)') + +vimrc.map_plug('n', 'go', '(my-insert-blank-lines-after)') +vimrc.map_plug('n', 'gO', '(my-insert-blank-lines-before)') + + +vimrc.map('n', '<Space>w', ':<C-u>write<CR>', { silent = true }) + + +-- Abbreviations {{{1 + +vim.cmd('inoreabbrev retrun return') +vim.cmd('inoreabbrev reutrn return') +vim.cmd('inoreabbrev tihs this') + + + +-- Commands {{{1 + +-- Reverse a selected range in line-wise. +-- Note: directly calling `g/^/m` will overwrite the current search pattern with +-- '^' and highlight it, which is not expected. +-- :h :keeppatterns +vim.cmd([[ +command! -bar -range=% + \ Reverse + \ keeppatterns <line1>,<line2>g/^/m<line1>-1 +]]) + + + +-- ftplugin {{{1 + +-- This command do the followings: +-- * Execute |:setlocal| for each options. +-- * Set information to restore the original setting to b:|undo_ftplugin|. + +-- This command is used in my/ftplugin/*.vim. + +-- Note: specify only single option. + +vim.cmd([[ +function My_ftplugin_setlocal(qargs) + execute 'setlocal' a:qargs + + let option_name = substitute(a:qargs, '\L.*', '', '') + + if option_name ==# 'shiftwidth' && exists(':IndentLinesReset') ==# 2 + IndentLinesReset + end + + if exists('b:undo_ftplugin') + let b:undo_ftplugin .= '|setlocal ' .. option_name .. '<' + else + let b:undo_ftplugin = 'setlocal ' .. option_name .. '<' + end +endfunction +]]) + +vim.cmd([[ +command! -nargs=+ + \ FtpluginSetLocal + \ call My_ftplugin_setlocal(<q-args>) +]]) + + + + +-- Color scheme {{{1 + +-- A command which changes color scheme with fall back. +vim.cmd([[ +function My_colorscheme(bang, name) + try + if get(g:, 'colors_name') isnot# a:name || a:bang + execute 'colorscheme' a:name + end + catch + " Loading colorscheme failed. + " The color scheme, "desert", is one of the built-in ones. Probably, it + " will be loaded without any errors. + colorscheme desert + endtry +endfunction +]]) + + +vim.cmd([[ +command! -bang -nargs=? + \ ColorScheme + \ call My_colorscheme(<bang>0, <q-args>) +]]) + + +vim.cmd('ColorScheme! ocean') + + + + +-- Plugins configuration {{{1 + +-- Disable standard plugins. {{{2 + +vim.g.loaded_gzip = 1 +vim.g.loaded_matchparen = 1 +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +vim.g.loaded_spellfile_plugin = 1 +vim.g.loaded_tarPlugin = 1 +vim.g.loaded_zipPlugin = 1 + + + +-- altr {{{2 + +-- C/C++ +vim.fn['altr#define']('%.c', '%.cpp', '%.cc', '%.h', '%.hh', '%.hpp') +-- Vim +vim.fn['altr#define']('autoload/%.vim', 'doc/%.txt', 'plugin/%.vim') + +-- Go to File Alternative +vimrc.map_plug('n', 'gfa', '(altr-forward)') + + + + +-- asterisk {{{2 + +vim.cmd([[ +function My_asterisk(ret, keeppos) + let g:asterisk#keeppos = a:keeppos + return a:ret +endfunction +]]) + +-- Do not keep the relative cursor position. +vim.cmd([[ +nmap <expr> * My_asterisk('<Plug>(asterisk-z*)', 0) +omap <expr> * My_asterisk('<Plug>(asterisk-z*)', 0) +xmap <expr> * My_asterisk('<Plug>(asterisk-z*)', 0) +nmap <expr> g* My_asterisk('<Plug>(asterisk-gz*)', 0) +omap <expr> g* My_asterisk('<Plug>(asterisk-gz*)', 0) +xmap <expr> g* My_asterisk('<Plug>(asterisk-gz*)', 0) +]]) + +-- Keep the relative cursor position (use offset like /s+1). +-- Note: I fix the search direction in typing 'n' and 'N', so there is no +-- difference between '*' and '#'. +vim.cmd([[ +nmap <expr> # My_asterisk('<Plug>(asterisk-z*)', 1) +omap <expr> # My_asterisk('<Plug>(asterisk-z*)', 1) +xmap <expr> # My_asterisk('<Plug>(asterisk-z*)', 1) +nmap <expr> g# My_asterisk('<Plug>(asterisk-gz*)', 1) +omap <expr> g# My_asterisk('<Plug>(asterisk-gz*)', 1) +xmap <expr> g# My_asterisk('<Plug>(asterisk-gz*)', 1) +]]) + + + +-- autodirmake {{{2 + +vim.g['autodirmake#msg_highlight'] = 'Question' + + + +-- autopep8 {{{2 + +vim.g.autopep8_on_save = true +vim.g.autopep8_disable_show_diff = true + +vim.cmd([[ +command! + \ Autopep8Disable + \ let g:autopep8_on_save = 0 +]]) + + + +-- caw {{{2 + +vim.g.caw_no_default_keymappings = true + +vimrc.map_plug('n', 'm//', '(caw:hatpos:toggle)') +vimrc.map_plug('x', 'm//', '(caw:hatpos:toggle)') +vimrc.map_plug('n', 'm/w', '(caw:wrap:comment)') +vimrc.map_plug('x', 'm/w', '(caw:wrap:comment)') +vimrc.map_plug('n', 'm/W', '(caw:wrap:uncomment)') +vimrc.map_plug('x', 'm/W', '(caw:wrap:uncomment)') +vimrc.map_plug('n', 'm/b', '(caw:box:comment)') +vimrc.map_plug('x', 'm/b', '(caw:box:comment)') + + + +-- clang-format {{{2 + +vim.g['clang_format#auto_format'] = true + +vimrc.autocmd('FileType', 'javascript,typescript', function() + vim.cmd('ClangFormatAutoDisable') +end) + + + +-- ctrlp {{{2 + +vim.g.ctrlp_map = '<Space>f' +vim.g.ctrlp_match_func = { match = 'ctrlp_matchfuzzy#matcher' } + + + +-- dirvish {{{2 + +-- Prevent dirvish from mapping hyphen key to "<Plug>(dirvish_up)". +-- nmap <Plug>(nomap-dirvish_up) <Plug>(dirvish_up) + + + +-- easyalign {{{2 + +vimrc.map_plug('n', '=', '(EasyAlign)') +vimrc.map_plug('x', '=', '(EasyAlign)') + + + +-- easymotion {{{2 + +vim.g.EasyMotion_keys = 'asdfghweryuiocvbnmjkl;' +vim.g.EasyMotion_space_jump_first = true +vim.g.EasyMotion_do_shade = false +vim.g.EasyMotion_do_mappings = false +vim.g.EasyMotion_smartcase = true +vim.g.EasyMotion_verbose = false +vim.g.EasyMotion_startofline = false + +vimrc.map_plug('n', 'f', '(easymotion-fl)') +vimrc.map_plug('o', 'f', '(easymotion-fl)') +vimrc.map_plug('x', 'f', '(easymotion-fl)') +vimrc.map_plug('n', 'F', '(easymotion-Fl)') +vimrc.map_plug('o', 'F', '(easymotion-Fl)') +vimrc.map_plug('x', 'F', '(easymotion-Fl)') +vimrc.map_plug('o', 't', '(easymotion-tl)') +vimrc.map_plug('x', 't', '(easymotion-tl)') +vimrc.map_plug('o', 'T', '(easymotion-Tl)') +vimrc.map_plug('x', 'T', '(easymotion-Tl)') + +-- Note: Don't use the following key sequences! It is used 'vim-sandwich'. +-- * sa +-- * sd +-- * sr +vimrc.map_plug('n', 'ss', '(easymotion-s2)') +vimrc.map_plug('o', 'ss', '(easymotion-s2)') +vimrc.map_plug('x', 'ss', '(easymotion-s2)') +vimrc.map_plug('n', 'sw', '(easymotion-bd-w)') +vimrc.map_plug('o', 'sw', '(easymotion-bd-w)') +vimrc.map_plug('x', 'sw', '(easymotion-bd-w)') +vimrc.map_plug('n', 'sn', '(easymotion-n)') +vimrc.map_plug('o', 'sn', '(easymotion-n)') +vimrc.map_plug('x', 'sn', '(easymotion-n)') +vimrc.map_plug('n', 'sN', '(easymotion-N)') +vimrc.map_plug('o', 'sN', '(easymotion-N)') +vimrc.map_plug('x', 'sN', '(easymotion-N)') +vimrc.map_plug('n', 'sj', '(easymotion-j)') +vimrc.map_plug('o', 'sj', '(easymotion-j)') +vimrc.map_plug('x', 'sj', '(easymotion-j)') +vimrc.map_plug('n', 'sk', '(easymotion-k)') +vimrc.map_plug('o', 'sk', '(easymotion-k)') +vimrc.map_plug('x', 'sk', '(easymotion-k)') + + + +-- eskk {{{2 + +vim.g['eskk#dictionary'] = { + path = my_env.skk_dir .. '/jisyo', + sorted = false, + encoding = 'utf-8', +} + +vim.g['eskk#large_dictionary'] = { + path = my_env.skk_dir .. '/jisyo.L', + sorted = true, + encoding = 'euc-jp', +} + +vim.g['eskk#backup_dictionary'] = vim.g['eskk#dictionary'].path .. ".bak" + +vim.g['eskk#kakutei_when_unique_candidate'] = true +vim.g['eskk#enable_completion'] = false + + + +vim.cmd([[ +function My_eskk_initialize_pre() + let t = eskk#table#new('rom_to_hira*', 'rom_to_hira') + call t.add_map('z ', ' ') + call t.add_map('0.', '0.') + call t.add_map('1.', '1.') + call t.add_map('2.', '2.') + call t.add_map('3.', '3.') + call t.add_map('4.', '4.') + call t.add_map('5.', '5.') + call t.add_map('6.', '6.') + call t.add_map('7.', '7.') + call t.add_map('8.', '8.') + call t.add_map('9.', '9.') + call eskk#register_mode_table('hira', t) +endfunction + + +autocmd Vimrc User eskk-initialize-pre call My_eskk_initialize_pre() + + +function My_eskk_initialize_post() + " I don't use hankata mode for now. + EskkUnmap -type=mode:hira:toggle-hankata + EskkUnmap -type=mode:kata:toggle-hankata + + " I don't use abbrev mode for now. + EskkUnmap -type=mode:hira:to-abbrev + EskkUnmap -type=mode:kata:to-abbrev + + " I don't use ascii mode for now. + EskkUnmap -type=mode:hira:to-ascii + EskkUnmap -type=mode:kata:to-ascii + + " Instead, l key disable SKK input. + EskkMap -type=disable l + EskkMap -type=disable l +endfunction + + +autocmd Vimrc User eskk-initialize-post call My_eskk_initialize_post() +]]) + + + +-- foldcc {{{2 + +vim.o.foldtext = 'FoldCCtext()' +vim.g.foldCCtext_head = 'repeat(">", v:foldlevel) . " "' + + + +-- incsearch {{{2 + +vimrc.map_plug('n', '/', '(incsearch-forward)') +vimrc.map_plug('o', '/', '(incsearch-forward)') +vimrc.map_plug('x', '/', '(incsearch-forward)') +vimrc.map_plug('n', '?', '(incsearch-backward)') +vimrc.map_plug('o', '?', '(incsearch-backward)') +vimrc.map_plug('x', '?', '(incsearch-backward)') +vimrc.map_plug('n', 'g/', '(incsearch-stay)') +vimrc.map_plug('o', 'g/', '(incsearch-stay)') +vimrc.map_plug('x', 'g/', '(incsearch-stay)') + + + +-- indentline {{{2 + +vim.g.indentLine_conceallevel = 1 +vim.g.indentLine_fileTypeExclude = { 'help' } + + + +-- jplus {{{2 + +vim.g['jplus#input_config'] = { + __DEFAULT__ = { delimiter_format = ' %d ' }, + __EMPTY__ = { delimiter_format = '' }, + [' '] = { delimiter_format = ' ' }, + [','] = { delimiter_format = '%d ' }, + [';'] = { delimiter_format = '%d ' }, + l = { delimiter_format = '' }, + L = { delimiter_format = '' }, +} + +vimrc.map_plug('n', 'J', '(jplus-getchar)') +vimrc.map_plug('x', 'J', '(jplus-getchar)') +vimrc.map_plug('n', 'gJ', '(jplus-input)') +vimrc.map_plug('x', 'gJ', '(jplus-input)') + + + +-- lightline {{{2 + +vimrc.lightline = {} + +function vimrc.lightline.mode() + -- Calling `eskk#statusline()` makes Vim autoload eskk. If you call it + -- without checking `g:loaded_autoload_eskk`, eskk is loaded on an early + -- stage of the initialization (probably the first rendering of status line), + -- which slows down Vim startup. Loading eskk can be delayed by checking both + -- of `g:loaded_eskk` and `g:loaded_autoload_eskk`. + local skk + if vim.g.loaded_eskk and vim.g.loaded_autoload_eskk then + skk = vim.fn['eskk#statusline'](' (%s)', '') + else + skk = '' + end + return vim.fn['lightline#mode']() .. skk +end + + +function vimrc.lightline.linenum() + return vim.fn.line('.') .. '/' .. vim.fn.line('$') +end + + +function vimrc.lightline.fileformat() + if vim.o.fileformat == 'unix' then + return 'LF' + elseif vim.o.fileformat == 'dos' then + return 'CRLF' + elseif vim.o.fileformat == 'mac' then + return 'CR' + else + return '-' + end +end + + +vim.cmd([[ +function! Lightline_mode() abort + return v:lua.vimrc.lightline.mode() +endfunction + +function! Lightline_linenum() abort + return v:lua.vimrc.lightline.linenum() +endfunction + +function! Lightline_fileformat() abort + return v:lua.vimrc.lightline.fileformat() +endfunction +]]) + + + +vim.g.lightline = { + colorscheme = 'jellybeans', + active = { + left = {{'mode', 'paste'}, {'readonly', 'filename', 'modified'}}, + right = {{'linenum'}, {'fileencoding', 'fileformat', 'filetype'}}, + }, + inactive = { + left = {{'readonly', 'filename', 'modified'}}, + right = {{'linenum'}, {'fileencoding', 'fileformat', 'filetype'}}, + }, + component_function = { + mode = 'Lightline_mode', + linenum = 'Lightline_linenum', + fileformat = 'Lightline_fileformat', + }, + mode_map = { + n = 'N', + i = 'I', + R = 'R', + v = 'V', + V = 'V-L', + [vimrc.term("<C-v>")] = 'V-B', + c = 'C', + s = 'S', + S = 'S-L', + [vimrc.term("<C-s>")] = 'S-B', + t = 'T', + }, + tabline = { + left = {{'tabs'}}, + right = {}, + }, + tab = { + active = {'tabnum', 'filename', 'modified'}, + inactive = {'tabnum', 'filename', 'modified'}, + }, +} + + + + +-- vim-lsp {{{2 + +-- TODO + + + +-- niceblock {{{2 + +vimrc.map_plug('x', 'I', '(niceblock-I)') +vimrc.map_plug('x', 'gI', '(niceblock-gI)') +vimrc.map_plug('x', 'A', '(niceblock-A)') + + + + + + +-- operator-replace {{{2 + +vimrc.map_plug('n', '<C-p>', '(operator-replace)') +vimrc.map_plug('o', '<C-p>', '(operator-replace)') +vimrc.map_plug('x', '<C-p>', '(operator-replace)') + + + +-- operator-search {{{2 + +-- Note: m/ is the prefix of comment out. +vimrc.map_plug('n', 'm?', '(operator-search)') +vimrc.map_plug('o', 'm?', '(operator-search)') +vimrc.map_plug('x', 'm?', '(operator-search)') + + + +-- qfreplace {{{2 + +vimrc.map('n', 'br', ':<C-u>Qfreplace SmartOpen<CR>', { silent = true }) + + + +-- quickhl {{{2 + +-- TODO: CUI +vim.g.quickhl_manual_colors = { + 'guifg=#101020 guibg=#8080c0 gui=bold', + 'guifg=#101020 guibg=#80c080 gui=bold', + 'guifg=#101020 guibg=#c08080 gui=bold', + 'guifg=#101020 guibg=#80c0c0 gui=bold', + 'guifg=#101020 guibg=#c0c080 gui=bold', + 'guifg=#101020 guibg=#a0a0ff gui=bold', + 'guifg=#101020 guibg=#a0ffa0 gui=bold', + 'guifg=#101020 guibg=#ffa0a0 gui=bold', + 'guifg=#101020 guibg=#a0ffff gui=bold', + 'guifg=#101020 guibg=#ffffa0 gui=bold', +} + +vimrc.map_plug('n', '"', '(quickhl-manual-this)') +vimrc.map_plug('x', '"', '(quickhl-manual-this)') +vimrc.map('n', '<C-c>', ':<C-u>nohlsearch <Bar> QuickhlManualReset<CR>', { silent = true }) + + + +-- quickrun {{{2 + +vim.g.quickrun_no_default_key_mappings = true + +vim.g.quickrun_config = { + cpp = { + cmdopt = '--std=c++17 -Wall -Wextra', + }, + d = { + exec = 'dub run', + }, + haskell = { + exec = {'stack build', 'stack exec %{matchstr(globpath(".,..,../..,../../..", "*.cabal"), "\\w\\+\\ze\\.cabal")}'}, + }, + python = { + command = 'python3', + }, +} + + +vimrc.map_plug('n', 'BB', '(quickrun)') +vimrc.map_plug('x', 'BB', '(quickrun)') + + + + +-- repeat {{{2 + +vimrc.map_plug('n', 'U', '(RepeatRedo)') +-- Autoload vim-repeat immediately in order to make <Plug>(RepeatRedo) available. +-- repeat#setreg() does nothing here. +vim.fn['repeat#setreg']('', '') + + +-- Make them repeatable with vim-repeat. +vim.cmd([[ +nnoremap <silent> <Plug>(my-insert-blank-lines-after) + \ :<C-u>call v:lua.vimrc.map_callbacks.insert_blank_line(0)<Bar> + \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-after)")<CR> +nnoremap <silent> <Plug>(my-insert-blank-lines-before) + \ :<C-u>call v:lua.vimrc.map_callbacks.insert_blank_line(1)<Bar> + \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-before)")<CR> +]]) + + + +-- ripgrep {{{2 + +-- Workaround: do not open quickfix window. +-- exe g:rg_window_location 'copen' +vim.g.rg_window_location = 'silent! echo' +vim.g.rg_jump_to_first = true + +vim.cmd([[ +command! -bang -nargs=* -complete=file -bar + \ RG + \ Rg<bang> <args> +]]) + + +-- rust {{{2 + +vim.g.rustfmt_autosave = true + + + + +-- sandwich {{{2 + + + + + + +-- splitjoin {{{2 + +-- Note: Don't use J{any sign}, 'Jl' and 'JL'. They will conflict with 'vim-jplus'. +vim.g.splitjoin_split_mapping = '' +vim.g.splitjoin_join_mapping = '' + +vimrc.map('n', 'JS', ':<C-u>SplitjoinSplit<CR>', { silent = true }) +vimrc.map('n', 'JJ', ':<C-u>SplitjoinJoin<CR>', { silent = true }) + + + +-- submode {{{2 + +-- Global settings {{{3 +vim.g.submode_always_show_submode = true +vim.g.submode_keyseqs_to_leave = { '<C-c>', '<ESC>' } +vim.g.submode_keep_leaving_key = true + + +-- yankround {{{3 +vim.fn['submode#enter_with']('YankRound', 'nv', 'rs', 'gp', '<Plug>(yankround-p)') +vim.fn['submode#enter_with']('YankRound', 'nv', 'rs', 'gP', '<Plug>(yankround-P)') +vim.fn['submode#map']('YankRound', 'nv', 'rs', 'p', '<Plug>(yankround-prev)') +vim.fn['submode#map']('YankRound', 'nv', 'rs', 'P', '<Plug>(yankround-next)') + +-- swap {{{3 +vim.fn['submode#enter_with']('Swap', 'n', 'r', 'g>', '<Plug>(swap-next)') +vim.fn['submode#map']('Swap', 'n', 'r', '<', '<Plug>(swap-prev)') +vim.fn['submode#enter_with']('Swap', 'n', 'r', 'g<', '<Plug>(swap-prev)') +vim.fn['submode#map']('Swap', 'n', 'r', '>', '<Plug>(swap-next)') + +-- Resizing a window (height) {{{3 +vim.fn['submode#enter_with']('WinResizeH', 'n', '', 'trh') +vim.fn['submode#enter_with']('WinResizeH', 'n', '', 'trh') +vim.fn['submode#map']('WinResizeH', 'n', '', '+', '<C-w>+') +vim.fn['submode#map']('WinResizeH', 'n', '', '-', '<C-w>-') + +-- Resizing a window (width) {{{3 +vim.fn['submode#enter_with']('WinResizeW', 'n', '', 'trw') +vim.fn['submode#enter_with']('WinResizeW', 'n', '', 'trw') +vim.fn['submode#map']('WinResizeW', 'n', '', '+', '<C-w>>') +vim.fn['submode#map']('WinResizeW', 'n', '', '-', '<C-w><Lt>') + +-- Super undo/redo {{{3 +vim.fn['submode#enter_with']('Undo/Redo', 'n', '', 'gu', 'g-') +vim.fn['submode#map']('Undo/Redo', 'n', '', 'u', 'g-') +vim.fn['submode#enter_with']('Undo/Redo', 'n', '', 'gU', 'g+') +vim.fn['submode#map']('Undo/Redo', 'n', '', 'U', 'g+') + + + +-- swap {{{2 + +vim.g.swap_no_default_key_mappings = true + + + +-- textobj-continuousline {{{2 + +vim.g.textobj_continuous_line_no_default_key_mappings = true + +vimrc.map_plug('o', 'aL', '(textobj-continuous-cpp-a)') +vimrc.map_plug('x', 'aL', '(textobj-continuous-cpp-a)') +vimrc.map_plug('o', 'iL', '(textobj-continuous-cpp-i)') +vimrc.map_plug('x', 'iL', '(textobj-continuous-cpp-i)') + +vim.cmd([[ +autocmd Vimrc FileType vim omap <buffer> aL <Plug>(textobj-continuous-vim-a) +autocmd Vimrc FileType vim xmap <buffer> aL <Plug>(textobj-continuous-vim-a) +autocmd Vimrc FileType vim omap <buffer> iL <Plug>(textobj-continuous-vim-i) +autocmd Vimrc FileType vim xmap <buffer> iL <Plug>(textobj-continuous-vim-i) +]]) + + + +-- textobj-lastpaste {{{2 + +vim.g.textobj_lastpaste_no_default_key_mappings = true + +vimrc.map_plug('o', 'iP', '(textobj-lastpaste-i)') +vimrc.map_plug('x', 'iP', '(textobj-lastpaste-i)') +vimrc.map_plug('o', 'aP', '(textobj-lastpaste-a)') +vimrc.map_plug('x', 'aP', '(textobj-lastpaste-a)') + + + +-- textobj-space {{{2 + +vim.g.textobj_space_no_default_key_mappings = true + +vimrc.map_plug('o', 'a<Space>', '(textobj-space-a)') +vimrc.map_plug('x', 'a<Space>', '(textobj-space-a)') +vimrc.map_plug('o', 'i<Space>', '(textobj-space-i)') +vimrc.map_plug('x', 'i<Space>', '(textobj-space-i)') + + +-- textobj-wiw {{{2 + +vim.g.textobj_wiw_no_default_key_mappings = true + +vimrc.map_plug('n', '<C-w>', '(textobj-wiw-n)') +vimrc.map_plug('o', '<C-w>', '(textobj-wiw-n)') +vimrc.map_plug('x', '<C-w>', '(textobj-wiw-n)') +vimrc.map_plug('n', 'g<C-w>', '(textobj-wiw-p)') +vimrc.map_plug('o', 'g<C-w>', '(textobj-wiw-p)') +vimrc.map_plug('x', 'g<C-w>', '(textobj-wiw-p)') +vimrc.map_plug('n', '<C-e>', '(textobj-wiw-N)') +vimrc.map_plug('o', '<C-e>', '(textobj-wiw-N)') +vimrc.map_plug('x', '<C-e>', '(textobj-wiw-N)') +vimrc.map_plug('n', 'g<C-e>', '(textobj-wiw-P)') +vimrc.map_plug('o', 'g<C-e>', '(textobj-wiw-P)') +vimrc.map_plug('x', 'g<C-e>', '(textobj-wiw-P)') + +vimrc.map_plug('o', 'a<C-w>', '(textobj-wiw-a)') +vimrc.map_plug('x', 'a<C-w>', '(textobj-wiw-a)') +vimrc.map_plug('o', 'i<C-w>', '(textobj-wiw-i)') +vimrc.map_plug('x', 'i<C-w>', '(textobj-wiw-i)') + + + +-- window-adjuster {{{2 + +vimrc.map('n', 'tRw', ':<C-u>AdjustScreenWidth<CR>', { silent = true }) +vimrc.map('n', 'tRh', ':<C-u>AdjustScreenHeight<CR>', { silent = true }) +vimrc.map('n', 'tRr', ':<C-u>AdjustScreenWidth <Bar> AdjustScreenHeight<CR>', { silent = true }) + + + + + +-- yankround {{{2 + +vim.g.yankround_dir = my_env.yankround_dir +vim.g.yankround_use_region_hl = true + + + + + +-- Modelines {{{1 + +-- vim: expandtab:softtabstop=3:shiftwidth=3:textwidth=80:colorcolumn=+1: +-- vim: foldenable:foldmethod=marker:foldlevel=0: diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim deleted file mode 100644 index 7cddc92..0000000 --- a/.config/nvim/init.vim +++ /dev/null @@ -1,1880 +0,0 @@ -" Global settings {{{1 - -" Global constants {{{2 - -let g:MY_ENV = {} - -if has('unix') - let g:MY_ENV.os = 'unix' -elseif has('mac') - let g:MY_ENV.os = 'mac' -elseif has('wsl') - let g:MY_ENV.os = 'wsl' -elseif has('win32') || has('win64') - let g:MY_ENV.os = 'windows' -else - let g:MY_ENV.os = 'unknown' -endif - -if empty($XDG_CONFIG_HOME) - let g:MY_ENV.config_home = $HOME . '/.config' -else - let g:MY_ENV.config_home = $XDG_CONFIG_HOME -endif -if empty($XDG_CACHE_HOME) - let g:MY_ENV.cache_home = $HOME . '/.cache' -else - let g:MY_ENV.cache_home = $XDG_CONFIG_HOME -endif -if empty($XDG_DATA_HOME) - let g:MY_ENV.data_home = $HOME . '/.local/share' -else - let g:MY_ENV.data_home = $XDG_DATA_HOME -endif - -let g:MY_ENV.config_dir = g:MY_ENV.config_home . '/nvim' -let g:MY_ENV.cache_dir = g:MY_ENV.cache_home . '/nvim' -let g:MY_ENV.data_dir = g:MY_ENV.data_home . '/nvim' - -let g:MY_ENV.my_dir = g:MY_ENV.config_dir . '/my' -let g:MY_ENV.plug_dir = g:MY_ENV.config_dir . '/plugged' -let g:MY_ENV.yankround_dir = g:MY_ENV.data_dir . '/yankround' -let g:MY_ENV.skk_dir = g:MY_ENV.config_home . '/skk' - -for [s:k, s:v] in items(g:MY_ENV) - if s:k =~# '_dir$' && !isdirectory(s:v) - call mkdir(s:v, 'p') - endif -endfor -unlet s:k s:v - - - - -" The autogroup used in .vimrc {{{2 - -augroup Vimrc - autocmd! -augroup END - - -" Note: |:autocmd| does not accept |-bar|. -command! -nargs=* - \ Autocmd - \ autocmd Vimrc <args> - - - -" Language {{{2 - -" Disable L10N. -language messages C -language time C - - - - - -" Options {{{1 - -" * Use |:set|, not |:setglobal|. -" |:setglobal| does not set local options, so options are not set in -" the starting buffer you specified as commandline arguments like -" "$ vim ~/.vimrc". - -" Moving around, searching and patterns {{{2 - -set nowrapscan -set ignorecase -set smartcase - - - -" Displaying text {{{2 - -set scrolloff=7 -set linebreak -set breakindent -set breakindentopt+=sbr -let &showbreak = '> ' -set sidescrolloff=20 -let &fillchars = 'stl: ,stlnc: ,vert: ,fold: ,diff: ' -set cmdheight=2 -set list -let &listchars="eol:\u00ac,tab:\u25b8 ,trail:\u00b7,extends:\u00bb,precedes:\u00ab" -set concealcursor=cnv - - - -" Syntax, highlighting and spelling {{{2 - -set background=dark -set synmaxcol=500 -set hlsearch -" Execute nohlsearch to avoid highlighting last searched pattern when reloading -" .vimrc. -nohlsearch -set termguicolors -set colorcolumn=+1 - - -" Multiple windows {{{2 - -set winminheight=0 -set hidden -set switchbuf=usetab - - - -" Multiple tabpages {{{2 - -set showtabline=2 - - - -" Terminal {{{2 - -set notitle - - - -" Using the mouse {{{2 - -set mouse= - - - -" Messages and info {{{2 - -set shortmess+=a -set shortmess+=s -set shortmess+=I -set shortmess+=c -set noshowmode -set report=999 -set confirm - - - -" Selecting text {{{2 - -set clipboard=unnamed - - - -" Editing text {{{2 - -set undofile -set textwidth=0 -set completeopt-=preview -set pumheight=10 -set matchpairs+=<:> -set nojoinspaces -set nrformats+=unsigned - - - -" Tabs and indenting {{{2 -" Note: you should also set them for each file types. -" These following settings are global, used for unknown file types. - -set tabstop=4 -set shiftwidth=4 -set softtabstop=4 -set expandtab -set smartindent -set copyindent -set preserveindent - - - -" Folding {{{2 - -set foldlevelstart=0 -set foldopen+=insert -set foldmethod=marker - - - -" Diff mode {{{2 - -set diffopt+=vertical - \ diffopt+=foldcolumn:3 - - - -" Mapping {{{2 - -set maxmapdepth=10 -set notimeout - - - -" Reading and writing files {{{2 - -set nofixendofline -" Note: if 'fileformat' is empty, the first item of 'fileformats' is used. -set fileformats=unix,dos -" Note: these settings make one backup. If you want more backups, see -" |'backupext'|. -set backup -set autowrite - - - -" Command line editing {{{2 -set wildignore+=*.o,*.obj,*.lib -set wildignorecase - - - -" Executing external commands {{{2 - -set shell=zsh -set keywordprg= - - - -" Encoding {{{2 - -" Note: if 'fileencoding' is empty, 'encoding' is used. -set fileencodings=utf-8,cp932,euc-jp - - - -" Misc. {{{2 - -set sessionoptions+=localoptions -set sessionoptions+=resize -set sessionoptions+=winpos - - - -" Installed plugins {{{1 - -" === BEGIN === {{{2 - -execute 'set runtimepath+=' . g:MY_ENV.config_dir -call plug#begin(g:MY_ENV.plug_dir) - - -" Text editing {{{2 - -" IME {{{3 - -" SKK (Simple Kana to Kanji conversion program) for Vim. -Plug 'vim-skk/eskk.vim' - -" Operators {{{3 - -" Support for user-defined operators. -Plug 'kana/vim-operator-user' - -" Extract expression and make assingment statement. -Plug 'tek/vim-operator-assign' - -" Replace text without updating registers. -Plug 'kana/vim-operator-replace' - -" Reverse text. -Plug 'tyru/operator-reverse.vim' - -" Search in a specific region. -Plug 'osyo-manga/vim-operator-search' - -" Shiffle text. -Plug 'pekepeke/vim-operator-shuffle' - -" Sort text characterwise and linewise. -Plug 'emonkak/vim-operator-sort' - -" Super surround. -Plug 'machakann/vim-sandwich' - -" Non-operators {{{3 - -" Comment out. -Plug 'tyru/caw.vim' - -" Align text. -Plug 'junegunn/vim-easy-align', { 'on': '<Plug>(EasyAlign)' } - - -" Text objects {{{2 - -" Support for user-defined text objects. -Plug 'kana/vim-textobj-user' - -" Text object for blockwise. -Plug 'osyo-manga/vim-textobj-blockwise' - -" Text object for comment. -Plug 'thinca/vim-textobj-comment' - -" Text object for continuous line. -Plug 'rhysd/vim-textobj-continuous-line' - -" Text object for entire file. -Plug 'kana/vim-textobj-entire' - -" Text object for function. -Plug 'kana/vim-textobj-function' - -" Text object for indent. -Plug 'kana/vim-textobj-indent' - -" Text object for last inserted text. -Plug 'rhysd/vim-textobj-lastinserted' - -" Text object for last pasted text. -Plug 'gilligan/textobj-lastpaste' - -" Text object for last searched pattern. -Plug 'kana/vim-textobj-lastpat' - -" Text object for line. -Plug 'kana/vim-textobj-line' - -" Text object for parameter. -Plug 'sgur/vim-textobj-parameter' - -" Text object for space. -Plug 'saihoooooooo/vim-textobj-space' - -" Text object for syntax. -Plug 'kana/vim-textobj-syntax' - -" Text object for URL. -Plug 'mattn/vim-textobj-url' - -" Text object for words in words. -Plug 'h1mesuke/textobj-wiw' - - -" Search {{{2 - -" Extend * and #. -Plug 'haya14busa/vim-asterisk' - -" Extend incremental search. -Plug 'haya14busa/incsearch.vim' - -" NOTE: it is a fork version of jremmen/vim-ripgrep -" Integration with ripgrep, fast alternative of grep command. -Plug 'nsfisis/vim-ripgrep', { 'on': 'Rg' } - - -" Files {{{2 - -" Switch to related files. -Plug 'kana/vim-altr' - -" Fast Fuzzy Finder. -Plug 'ctrlpvim/ctrlp.vim', { 'on': '<Plug>(ctrlp)' } - -" CtrlP's matcher by builtin `matchfuzzy()`. -Plug 'mattn/ctrlp-matchfuzzy', { 'on': '<Plug>(ctrlp)' } - -" Filer for minimalists. -Plug 'justinmk/vim-dirvish' - - -" Appearance {{{2 - -" Show highlight. -Plug 'cocopon/colorswatch.vim', { 'on': 'ColorSwatchGenerate' } - -" NOTE: it is a fork of godlygeek/csapprox -" Make gui-only color schemes 256colors-compatible. -Plug 'nsfisis/csapprox' - -" Makes folding text cool. -Plug 'LeafCage/foldCC.vim' - -" Show indent. -Plug 'Yggdroot/indentLine' - -" Cool status line. -Plug 'itchyny/lightline.vim' - -" Highlight matched parentheses. -Plug 'itchyny/vim-parenmatch' - -" Highlight specified words. -Plug 't9md/vim-quickhl', { 'on': [ 'QuickhlManualReset', '<Plug>(quickhl-manual-this)'] } - - -" Filetypes {{{2 - -" Syntax {{{3 - -" HCL -Plug 'b4b4r07/vim-hcl' - -" JavaScript -Plug 'pangloss/vim-javascript', { 'for': 'javascript' } - -" JSON5 -Plug 'GutenYe/json5.vim' - -" MoonScript -Plug 'leafo/moonscript-vim' - -" Nginx conf -Plug 'chr4/nginx.vim' - -" Rust -Plug 'rust-lang/rust.vim', { 'for': 'rust' } - -" TOML -Plug 'cespare/vim-toml', { 'for': 'toml' } - -" TypeScript -Plug 'leafgarland/typescript-vim', { 'for': 'typescript' } - -" Tools {{{3 - -" C/C++: clang-format -Plug 'rhysd/vim-clang-format', { 'for': ['c', 'cpp'] } - -" Python: autopep8 -Plug 'tell-k/vim-autopep8', { 'for': 'python' } - - -" QoL {{{2 - -" If a directory is missing, make it automatically. -Plug 'mopp/autodirmake.vim' - -" Capture the output of a command. -Plug 'tyru/capture.vim' - -" Write git commit message. -Plug 'rhysd/committia.vim' - -" Motion on speed. -Plug 'easymotion/vim-easymotion', { 'on': [ - \ '<Plug>(easymotion-Fl)', - \ '<Plug>(easymotion-N)', - \ '<Plug>(easymotion-Tl)', - \ '<Plug>(easymotion-bd-w)', - \ '<Plug>(easymotion-fl)', - \ '<Plug>(easymotion-j)', - \ '<Plug>(easymotion-k)', - \ '<Plug>(easymotion-n)', - \ '<Plug>(easymotion-s2)', - \ '<Plug>(easymotion-tl)', - \ ] } - -" Integration with EditorConfig (https://editorconfig.org) -Plug 'editorconfig/editorconfig-vim' - -" Extend J. -Plug 'osyo-manga/vim-jplus' - -" Improve behaviors of I, A and gI in Blockwise-Visual mode. -Plug 'kana/vim-niceblock' - -" Edit QuickFix and reflect to original buffers. -Plug 'thinca/vim-qfreplace' - -" Run anything. -Plug 'thinca/vim-quickrun' - -" Extend dot-repeat. -Plug 'tpope/vim-repeat' - -" Split one line format and Join multiline format. -Plug 'AndrewRadev/splitjoin.vim' - -" Introduce user-defined mode. -Plug 'kana/vim-submode' - -" Swap arguments. -Plug 'machakann/vim-swap' - -" Adjust window size. -Plug 'rhysd/vim-window-adjuster' - -" Remember yank history and paste them. -Plug 'LeafCage/yankround.vim' - - -" === END === {{{2 - -Plug g:MY_ENV.my_dir - -call plug#end() - - - - -" Autocommands {{{1 - -" Auto-resize windows when Vim is resized. -Autocmd VimResized * wincmd = - - -" Calculate 'numberwidth' to fit file size. -" Note: extra 2 is the room of left and right spaces. -Autocmd BufEnter,WinEnter,BufWinEnter * - \ let &l:numberwidth = len(line('$')) + 2 - - -" Jump to the last cursor position when you open a file. -Autocmd BufRead * - \ if 0 < line("'\"") && line("'\"") <= line('$') && - \ &filetype !~# 'commit' && &filetype !~# 'rebase' | - \ execute "normal g`\"" | - \ endif - - -" Syntax highlight for .vimrc {{{2 - -Autocmd Filetype vim - \ if expand('%') =~? 'vimrc' || expand('%') =~? 'init.vim' | - \ call s:highlight_vimrc() | - \ endif - - -function! s:highlight_vimrc() abort - " Autocmd - syn keyword vimrcAutocmd Autocmd skipwhite nextgroup=vimAutoEventList - - " Plugin manager command - syn keyword vimrcPluginManager Plug - - hi def link vimrcAutocmd vimAutocmd - hi def link vimrcPluginManager vimCommand -endfunction - - - -Autocmd ColorScheme ocean call s:extra_highlight() - - -function! s:extra_highlight() abort - if &background != 'dark' - return - endif - - hi! link YankRoundRegion DiffChange - - hi! link OperatorSandwichBuns DiffChange - hi! link OperatorSandwichStuff DiffChange - hi! link OperatorSandwichDelete DiffChange - hi! link OperatorSandwichAdd OperatorSandwichBuns - - hi EasyMotionShade guifg=#4d4d4d guibg=NONE gui=NONE cterm=NONE - hi EasyMotionTarget guifg=#ff7100 guibg=NONE gui=underline cterm=underline - hi! link EasyMotionMoveHL IncSearch -endfunction - - - - -" Mappings {{{1 - -" Note: |:noremap| defines mappings in |Normal|, |Visual|, |Operator-Pending| -" and |Select| mode. Because I don't use |Select| mode, I use |:noremap| as -" substitute of |:nnoremap|, |:xnoremap| and |:onoremap| for simplicity. - - -" Fix the search direction. {{{2 - -noremap <expr> gn v:searchforward ? 'gn' : 'gN' -noremap <expr> gN v:searchforward ? 'gN' : 'gn' - -noremap <expr> n v:searchforward ? 'n' : 'N' -noremap <expr> N v:searchforward ? 'N' : 'n' - - - -nnoremap <silent> & :%&&<CR> -xnoremap <silent> & :%&&<CR> - - - -" Registers and macros. {{{2 - - -" Access an resister in the same way in Insert and Commandline mode. -nnoremap <C-r> " -xnoremap <C-r> " - - -" Paste clipboard content with 'paste' enabled -function! s:paste_clipboard_content_with_paste_opt() abort - let old_paste = &paste - set paste - set pastetoggle=<Plug>(pastetoggle) - if old_paste - return "\<C-r>+" - else - " 'paste' was off when the function was called. Then, 'paste' will be - " disabled via 'pastetoggle'. - return "\<C-r>+\<Plug>(pastetoggle)" - endif -endfunction - -" Automatically enable 'paste' and disable it after pasting clipboard's -" content. -inoremap <expr> <C-r>+ <SID>paste_clipboard_content_with_paste_opt() - - -let @j = 'j.' -let @k = 'k.' -let @n = 'n.' -nnoremap @N N. - -" Repeat the last executed macro as many times as possible. -" a => all -" Note: "let @a = '@@'" does not work well. -nnoremap @a 9999@@ - - -" Execute the last executed macro again. -nnoremap ` @@ - - - -" Emacs like key mappings in Insert and CommandLine mode. {{{2 - -function! s:go_to_beginning_of_line() abort - if col('.') == match(getline('.'), '\S') + 1 - return repeat("\<C-g>U\<Left>", col('.') - 1) - else - return (col('.') < match(getline('.'), '\S')) ? - \ repeat("\<C-g>U\<Right>", match(getline('.'), '\S') - col('.') + 1) : - \ repeat("\<C-g>U\<Left>", col('.') - 1 - match(getline('.'), '\S')) - endif -endfunction - - -inoremap <C-d> <Del> - -" Go elsewhere without deviding the undo history. -inoremap <expr> <C-a> <SID>go_to_beginning_of_line() -inoremap <expr> <C-e> repeat('<C-g>U<Right>', col('$') - col('.')) -inoremap <C-b> <C-g>U<Left> -inoremap <C-f> <C-g>U<Right> - -" Delete something deviding the undo history. -inoremap <C-u> <C-g>u<C-u> -inoremap <C-w> <C-g>u<C-w> - -cnoremap <C-a> <Home> -cnoremap <C-e> <End> -cnoremap <C-f> <Right> -cnoremap <C-b> <Left> -cnoremap <C-n> <Down> -cnoremap <C-p> <Up> -cnoremap <C-d> <Del> - -cnoremap <Left> <Nop> -inoremap <Left> <Nop> -cnoremap <Right> <Nop> -inoremap <Right> <Nop> - - - - -function! s:my_gA() - let line = getline('.') - if match(line, ';;$') != -1 " For OCaml. - return "A\<C-g>U\<Left>\<C-g>U\<Left>" - elseif match(line, '[,;)]$') != -1 - return "A\<C-g>U\<Left>" - else - return 'A' - endif -endfunction - -nnoremap <expr> gA <SID>my_gA() - - - -" QuickFix or location list. {{{2 - -nnoremap <silent> bb :<C-u>cc<CR> - -nnoremap <silent> bn :<C-u><C-r>=v:count1<CR>cnext<CR> -nnoremap <silent> bp :<C-u><C-r>=v:count1<CR>cprevious<CR> - -nnoremap <silent> bf :<C-u>cfirst<CR> -nnoremap <silent> bl :<C-u>clast<CR> - -nnoremap <silent> bS :colder<CR> -nnoremap <silent> bs :cnewer<CR> - - - -" Operators {{{2 - -" Throw deleted text into the black hole register ("_). -nnoremap c "_c -xnoremap c "_c -nnoremap C "_C -xnoremap C "_C - - -noremap g= = - - -noremap ml gu -noremap mu gU - -noremap gu <Nop> -noremap gU <Nop> -xnoremap u <Nop> -xnoremap U <Nop> - - -xnoremap x "_x - - -nnoremap Y y$ -" In Blockwise-Visual mode, select text linewise. -" In default, select text characterwise, neither blockwise nor linewise. -xnoremap <expr> Y mode() ==# 'V' ? 'y' : 'Vy' - - - -" Swap the keys entering Replace mode and Visual-Replace mode. -nnoremap R gR -nnoremap gR R -nnoremap r gr -nnoremap gr r - - -nnoremap U <C-r> - - - - -" Motions {{{2 - -noremap H ^ -noremap L $ -noremap M % - -noremap gw b -noremap gW B - -noremap k gk -noremap j gj -noremap gk k -noremap gj j - -nnoremap gff gF - - - -" Tabpages and windows. {{{2 - -function! s:move_current_window_to_tabpage() abort - if winnr('$') == 1 - " Leave the current window and open it in a new tabpage. - " Because :wincmd T fails when the current tabpage has only one window. - tab split - else - " Close the current window and re-open it in a new tabpage. - wincmd T - endif -endfunction - - -function! s:bdelete_bang_with_confirm() abort - if s:getchar_with_prompt('Delete? (y/n) ') ==? 'y' - bdelete! - else - echo 'Canceled' - endif -endfunction - - -function! s:choose_window_interactively() abort - const indicators = [ - \ 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ';', - \ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', - \ ] - - " List normal windows up to 20. - let wins = [] - for winnr in range(1, winnr('$')) - if winnr !=# winnr() && win_gettype(winnr) ==# '' - call add(wins, win_getid(winnr)) - endif - endfor - if len(indicators) < len(wins) - unlet wins[len(indicators):] - endif - - if len(wins) ==# 0 - return - endif - if len(wins) ==# 1 - if wins[0] ==# win_getid() - call win_gotoid(wins[1]) - else - call win_gotoid(wins[0]) - endif - return - endif - - " Show popups. - let popups = [] - for i in range(len(wins)) - let winid = wins[i] - let indicator = indicators[i] - let [winy, winx, winh, winw] = s:win_getrect(winid) - let buf_id = nvim_create_buf(v:false, v:true) - call nvim_buf_set_lines(buf_id, 0, -1, v:true, ['', ' ' . indicator . ' ', '']) - let popup = nvim_open_win( - \ buf_id, - \ v:false, - \ { - \ 'relative': 'win', - \ 'win': winid, - \ 'row': (winh - 5) / 2, - \ 'col': (winw - 9) / 2, - \ 'width': 5, - \ 'height': 3, - \ 'focusable': v:false, - \ 'style': 'minimal', - \ 'border': 'double', - \ 'noautocmd': v:true, - \ }) - call add(popups, #{ - \ winid: popup, - \ indicator: indicator, - \ target_winid: winid, - \ }) - endfor - - " Prompt - let result = s:getchar_with_prompt('Select window: ') - - " Jump - let jump_target = -1 - for popup in popups - if result ==? popup.indicator - let jump_target = popup.target_winid - endif - endfor - if jump_target !=# -1 - call win_gotoid(jump_target) - endif - - " Close popups - for popup in popups - call nvim_win_close(popup.winid, v:true) - endfor -endfunction - - -nnoremap <silent> tt :<C-u>tabnew<CR> -nnoremap <silent> tT :<C-u>call <SID>move_current_window_to_tabpage()<CR> - -nnoremap <silent> tn :<C-u><C-r>=(tabpagenr() + v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR> -nnoremap <silent> tp :<C-u><C-r>=(tabpagenr('$') * 10 + tabpagenr() - v:count1 - 1) % tabpagenr('$') + 1<CR>tabnext<CR> - -nnoremap <silent> tN :<C-u>tabmove +<CR> -nnoremap <silent> tP :<C-u>tabmove -<CR> - -nnoremap <silent> tsh :<C-u>leftabove vsplit<CR> -nnoremap <silent> tsj :<C-u>rightbelow split<CR> -nnoremap <silent> tsk :<C-u>leftabove split<CR> -nnoremap <silent> tsl :<C-u>rightbelow vsplit<CR> - -nnoremap <silent> tsH :<C-u>topleft vsplit<CR> -nnoremap <silent> tsJ :<C-u>botright split<CR> -nnoremap <silent> tsK :<C-u>topleft split<CR> -nnoremap <silent> tsL :<C-u>botright vsplit<CR> - -nnoremap <silent> twh :<C-u>leftabove vnew<CR> -nnoremap <silent> twj :<C-u>rightbelow new<CR> -nnoremap <silent> twk :<C-u>leftabove new<CR> -nnoremap <silent> twl :<C-u>rightbelow vnew<CR> - -nnoremap <silent> twH :<C-u>topleft vnew<CR> -nnoremap <silent> twJ :<C-u>botright new<CR> -nnoremap <silent> twK :<C-u>topleft new<CR> -nnoremap <silent> twL :<C-u>botright vnew<CR> - -nnoremap th <C-w>h -nnoremap tj <C-w>j -nnoremap tk <C-w>k -nnoremap tl <C-w>l - -nnoremap tH <C-w>H -nnoremap tJ <C-w>J -nnoremap tK <C-w>K -nnoremap tL <C-w>L - -nnoremap tx <C-w>x - -" r => manual resize. -" R => automatic resize. -nnoremap tRH <C-w>_ -nnoremap tRW <C-w><Bar> -nnoremap tRR <C-w>_<C-w><Bar> - -nnoremap t= <C-w>= - -nnoremap <silent> tq :<C-u>bdelete<CR> -nnoremap <silent> tQ :<C-u>call <SID>bdelete_bang_with_confirm()<CR> - -nnoremap tc <C-w>c - -nnoremap to <C-w>o -nnoremap <silent> tO :<C-u>tabonly<CR> - -nnoremap <silent> tg :<C-u>call <SID>choose_window_interactively()<CR> - - - -function! s:smart_open(command) abort - if winwidth(winnr()) < 150 - let modifiers = 'topleft' - else - let modifiers = 'vertical botright' - endif - - try - execute modifiers a:command - catch - echohl Error - echo v:exception - echohl None - return - endtry - - if &filetype ==# 'help' - if &l:textwidth > 0 - execute 'vertical resize' &l:textwidth - endif - " Help tags are often right-justfied, moving the cursor to BoL. - normal! 0 - endif -endfunction - - -command! -nargs=+ -complete=command - \ SmartOpen - \ call s:smart_open(<q-args>) - - - - -" Increment/decrement numbers {{{2 - -" nnoremap + <C-a> -" nnoremap - <C-x> -" xnoremap + <C-a> -" xnoremap - <C-x> -" xnoremap g+ g<C-a> -" xnoremap g- g<C-x> - - - -" Disable unuseful or dangerous mappings. {{{2 - -" Disable Select mode. -nnoremap gh <Nop> -nnoremap gH <Nop> -nnoremap g<C-h> <Nop> - -" Disable Ex mode. -nnoremap Q <Nop> -nnoremap gQ <Nop> - -nnoremap ZZ <Nop> -nnoremap ZQ <Nop> - - -" Help {{{2 - -" Search help. -nnoremap <C-h> :<C-u>SmartOpen help<Space> - - - -" For writing Vim script. {{{2 - - -if !v:vim_did_enter - " Define this function only when Vim is starting up. |v:vim_did_enter| - function! SourceThisFile() abort - let filename = expand('%') - if &filetype ==# 'vim' || expand('%:e') ==# 'vim' || filename =~# '\.g\?vimrc' - if &filetype !=# 'vim' - setfiletype vim - endif - update - unlet! g:loaded_{expand('%<')} - source % - else - echo filename ' is not a Vim Script.' - endif - endfunction -endif - - - -nnoremap <silent> XV :<C-u>tabedit $MYVIMRC<CR> - -nnoremap <silent> XX :<C-u>call SourceThisFile()<CR> - -" See |numbered-function|. -nnoremap <silent> XF :<C-u>function {<C-r>=v:count<CR>}<CR> - -nnoremap <silent> XM :<C-u>messages<CR> - -nnoremap <silent> XP :<C-u>call popup_clear(1)<CR> - - - - -" Misc. {{{2 - -onoremap <silent> gv :<C-u>normal! gv<CR> - -" Swap : and ;. -nnoremap ; : -nnoremap : ; -xnoremap ; : -xnoremap : ; -nnoremap @; @: -xnoremap @; @: -cnoremap <C-r>; <C-r>: -inoremap <C-r>; <C-r>: - - -" Since <ESC> may be mapped to something else somewhere, it should be :map, not -" :noremap. -imap jk <ESC> -cmap jk <ESC> - - - -nnoremap <silent> <C-c> :<C-u>nohlsearch<CR> - - - -nnoremap <silent> <Plug>(my-insert-blank-lines-after) - \ :<C-u>call <SID>insert_blank_line(0)<CR> -nnoremap <silent> <Plug>(my-insert-blank-lines-before) - \ :<C-u>call <SID>insert_blank_line(1)<CR> - -nmap go <Plug>(my-insert-blank-lines-after) -nmap gO <Plug>(my-insert-blank-lines-before) - -function! s:insert_blank_line(offset) abort - for i in range(v:count1) - call append(line('.') - a:offset, '') - endfor -endfunction - - -nnoremap <silent> <Space>w :<C-u>write<CR> - - -" Abbreviations {{{1 - -inoreabbrev retrun return -inoreabbrev reutrn return -inoreabbrev tihs this - - - - - -" Commands {{{1 - -" Set 'makeprg' to `ninja` if `build.ninja` exists in the current working -" directory. Then, execute :make command. -command! -bang -bar -nargs=* - \ Make - \ if filereadable('build.ninja') | - \ let &makeprg = 'ninja' | - \ endif | - \ make<bang> <args> - - -" Reverse a selected range in line-wise. -" Note: directly calling `g/^/m` will overwrite the current search pattern with -" '^' and highlight it, which is not expected. -" :h :keeppatterns -command! -bar -range=% - \ Reverse - \ keeppatterns <line1>,<line2>g/^/m<line1>-1 - - -function! s:dummy_man_command(mods, args) abort - " Delete the dummy command. - delcommand Man - " Load man.vim which defines |:Man|. - runtime ftplugin/man.vim - " Pass the given arguments to it. - execute printf("%s Man %s", a:mods, a:args) -endfunction - - -" To shorten Vim startup, lazily load ftplugin/man.vim. -command! -complete=shellcmd -nargs=+ - \ Man - \ call s:dummy_man_command(<q-mods>, <f-args>) - - - - -" ftplugin {{{1 - -" This command do the followings: -" * Execute |:setlocal| for each options. -" * Set information to restore the original setting to b:|undo_ftplugin|. - -" This command is used in ftplugin/*.vim. - -" Note: specify only single option. - -command! -nargs=+ - \ FtpluginSetLocal - \ call s:ftplugin_setlocal(<q-args>) - -function! s:ftplugin_setlocal(qargs) abort - execute 'setlocal' a:qargs - - let option_name = substitute(a:qargs, '\L.*', '', '') - - if option_name ==# 'shiftwidth' && exists(':IndentLinesReset') ==# 2 - IndentLinesReset - endif - - if exists('b:undo_ftplugin') - let b:undo_ftplugin .= '|setlocal ' . option_name . '<' - else - let b:undo_ftplugin = 'setlocal ' . option_name . '<' - endif -endfunction - - - - -" Color scheme {{{1 - -" A command which changes color scheme with fall back. -command! -bang -nargs=? - \ ColorScheme - \ call s:colorscheme(<bang>0, <q-args>) - - -function! s:colorscheme(bang, name) abort - try - if get(g:, 'colors_name') isnot# a:name || a:bang - execute 'colorscheme' a:name - endif - catch - " Loading colorscheme failed. - " The color scheme, "desert", is one of the built-in ones. Probably, it - " will be loaded without any errors. - colorscheme desert - endtry -endfunction - - -ColorScheme! ocean - - - - -" Plugins configuration {{{1 - -" Disable standard plugins. {{{2 - -let g:loaded_2html_plugin = 1 -let g:loaded_getscriptPlugin = 1 -let g:loaded_gzip = 1 -let g:loaded_logiPat = 1 -let g:loaded_matchparen = 1 -let g:loaded_netrwPlugin = 1 -let g:loaded_rrhelper = 1 -let g:loaded_spellfile_plugin = 1 -let g:loaded_tarPlugin = 1 -let g:loaded_vimballPlugin = 1 -let g:loaded_zipPlugin = 1 - - - -" altr {{{2 - -" For vim -call altr#define('autoload/%.vim', 'doc/%.txt', 'plugin/%.vim') -" For C and C++ -call altr#define('%.c', '%.cpp', '%.cc', '%.h', '%.hh', '%.hpp') - -" Go to File Alternative -nmap gfa <Plug>(altr-forward) - - - - -" asterisk {{{2 - -function! s:asterisk(ret, keeppos) - let g:asterisk#keeppos = a:keeppos - return a:ret -endfunction - -" Do not keep the relative cursor position. -nmap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0) -omap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0) -xmap <expr> * <SID>asterisk('<Plug>(asterisk-z*)', 0) -nmap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0) -omap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0) -xmap <expr> g* <SID>asterisk('<Plug>(asterisk-gz*)', 0) - -" Keep the relative cursor position (use offset like /s+1). -" Note: I fix the search direction in typing 'n' and 'N', so there is no -" difference between '*' and '#'. -nmap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1) -omap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1) -xmap <expr> # <SID>asterisk('<Plug>(asterisk-z*)', 1) -nmap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1) -omap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1) -xmap <expr> g# <SID>asterisk('<Plug>(asterisk-gz*)', 1) - - - -" autodirmake {{{2 - -let g:autodirmake#msg_highlight = 'Question' - - - -" autopep8 {{{2 - -let g:autopep8_on_save = 1 -let g:autopep8_disable_show_diff = 1 - -command! - \ Autopep8Disable - \ let g:autopep8_on_save = 0 - - - -" caw {{{2 - -let g:caw_no_default_keymappings = 1 - -nmap m// <Plug>(caw:hatpos:toggle) -xmap m// <Plug>(caw:hatpos:toggle) -nmap m/w <Plug>(caw:wrap:comment) -xmap m/w <Plug>(caw:wrap:comment) -nmap m/W <Plug>(caw:wrap:uncomment) -xmap m/W <Plug>(caw:wrap:uncomment) -nmap m/b <Plug>(caw:box:comment) -xmap m/b <Plug>(caw:box:comment) - - - -" clang-format {{{2 - -let g:clang_format#auto_format = 1 -Autocmd FileType javascript ClangFormatAutoDisable -Autocmd FileType typescript ClangFormatAutoDisable - - - -" ctrlp {{{2 - -let g:ctrlp_map = '<Space>f' -let g:ctrlp_match_func = {'match': 'ctrlp_matchfuzzy#matcher'} - - - -" dirvish {{{2 - -" Prevent dirvish from mapping hyphen key to "<Plug>(dirvish_up)". -" nmap <Plug>(nomap-dirvish_up) <Plug>(dirvish_up) - - - -" easyalign {{{2 - -nmap = <Plug>(EasyAlign) -xmap = <Plug>(EasyAlign) - - - -" easymotion {{{2 - -let g:EasyMotion_keys = 'asdfghweryuiocvbnmjkl;' -let g:EasyMotion_space_jump_first = 1 -let g:EasyMotion_do_shade = 0 -let g:EasyMotion_do_mappings = 0 -let g:EasyMotion_smartcase = 1 -let g:EasyMotion_verbose = 0 -let g:EasyMotion_startofline = 0 - -nmap f <Plug>(easymotion-fl) -omap f <Plug>(easymotion-fl) -xmap f <Plug>(easymotion-fl) -nmap F <Plug>(easymotion-Fl) -omap F <Plug>(easymotion-Fl) -xmap F <Plug>(easymotion-Fl) -omap t <Plug>(easymotion-tl) -xmap t <Plug>(easymotion-tl) -omap T <Plug>(easymotion-Tl) -xmap T <Plug>(easymotion-Tl) - -" Note: Don't use the following key sequences! It is used 'vim-sandwich'. -" * sa -" * sd -" * sr -nmap ss <Plug>(easymotion-s2) -omap ss <Plug>(easymotion-s2) -xmap ss <Plug>(easymotion-s2) -nmap sw <Plug>(easymotion-bd-w) -omap sw <Plug>(easymotion-bd-w) -xmap sw <Plug>(easymotion-bd-w) -nmap sn <Plug>(easymotion-n) -omap sn <Plug>(easymotion-n) -xmap sn <Plug>(easymotion-n) -nmap sN <Plug>(easymotion-N) -omap sN <Plug>(easymotion-N) -xmap sN <Plug>(easymotion-N) -nmap sj <Plug>(easymotion-j) -omap sj <Plug>(easymotion-j) -xmap sj <Plug>(easymotion-j) -nmap sk <Plug>(easymotion-k) -omap sk <Plug>(easymotion-k) -xmap sk <Plug>(easymotion-k) - - - -" eskk {{{2 - -let g:eskk#dictionary = { - \ 'path': g:MY_ENV.skk_dir . '/jisyo', - \ 'sorted': 0, - \ 'encoding': 'utf-8', - \ } - -let g:eskk#large_dictionary = { - \ 'path': g:MY_ENV.skk_dir . '/jisyo.L', - \ 'sorted': 1, - \ 'encoding': 'euc-jp', - \ } - -let g:eskk#backup_dictionary = g:eskk#dictionary.path . ".bak" - -let g:eskk#kakutei_when_unique_candidate = v:true -let g:eskk#enable_completion = v:false -" let g:eskk#no_default_mappings = v:true - - -function! s:eskk_initialize_pre() abort - let t = eskk#table#new('rom_to_hira*', 'rom_to_hira') - call t.add_map('z ', ' ') - call t.add_map('0.', '0.') - call t.add_map('1.', '1.') - call t.add_map('2.', '2.') - call t.add_map('3.', '3.') - call t.add_map('4.', '4.') - call t.add_map('5.', '5.') - call t.add_map('6.', '6.') - call t.add_map('7.', '7.') - call t.add_map('8.', '8.') - call t.add_map('9.', '9.') - call eskk#register_mode_table('hira', t) -endfunction - - -Autocmd User eskk-initialize-pre call s:eskk_initialize_pre() - - -function! s:eskk_initialize_post() abort - " I don't use hankata mode for now. - EskkUnmap -type=mode:hira:toggle-hankata - EskkUnmap -type=mode:kata:toggle-hankata - - " I don't use abbrev mode for now. - EskkUnmap -type=mode:hira:to-abbrev - EskkUnmap -type=mode:kata:to-abbrev - - " I don't use ascii mode for now. - EskkUnmap -type=mode:hira:to-ascii - EskkUnmap -type=mode:kata:to-ascii - - " Instead, l key disable SKK input. - EskkMap -type=disable l - EskkMap -type=disable l -endfunction - - -Autocmd User eskk-initialize-post call s:eskk_initialize_post() - - - -" foldcc {{{2 - -set foldtext=FoldCCtext() -let g:foldCCtext_head = 'repeat(">", v:foldlevel) . " "' - - - -" incsearch {{{2 - -" let g:incsearch#magic = '\v' - -nmap / <Plug>(incsearch-forward) -omap / <Plug>(incsearch-forward) -xmap / <Plug>(incsearch-forward) -nmap ? <Plug>(incsearch-backward) -omap ? <Plug>(incsearch-backward) -xmap ? <Plug>(incsearch-backward) -nmap g/ <Plug>(incsearch-stay) -omap g/ <Plug>(incsearch-stay) -xmap g/ <Plug>(incsearch-stay) - - - -" indentline {{{2 - -let g:indentLine_conceallevel = 1 -let g:indentLine_fileTypeExclude = ['help'] - - - -" jplus {{{2 - -let g:jplus#input_config = { - \ '__DEFAULT__': {'delimiter_format': ' %d '}, - \ '__EMPTY__': {'delimiter_format': ''}, - \ ' ': {'delimiter_format': ' '}, - \ ',': {'delimiter_format': '%d '}, - \ ';': {'delimiter_format': '%d '}, - \ 'l': {'delimiter_format': ''}, - \ 'L': {'delimiter_format': ''}, - \ "\<Tab>": {'delimiter_format': '%d'}, - \ } -nmap J <Plug>(jplus-getchar) -xmap J <Plug>(jplus-getchar) -nmap gJ <Plug>(jplus-input) -xmap gJ <Plug>(jplus-input) - - - -" lightline {{{2 - -let g:lightline = { - \ 'colorscheme': 'jellybeans', - \ 'active': { - \ 'left': [['mode', 'paste'], ['readonly', 'filename', 'modified']], - \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']] - \ }, - \ 'inactive': { - \ 'left': [['readonly', 'filename', 'modified']], - \ 'right': [['linenum'], ['fileencoding', 'fileformat', 'filetype']] - \ }, - \ 'component_function': { - \ 'mode': 'Lightline_mode', - \ 'linenum': 'Lightline_linenum', - \ 'fileformat': 'Lightline_fileformat', - \ }, - \ 'mode_map': { - \ 'n' : 'N', - \ 'i' : 'I', - \ 'R' : 'R', - \ 'v' : 'V', - \ 'V' : 'V-L', - \ "\<C-v>": 'V-B', - \ 'c' : 'C', - \ 's' : 'S', - \ 'S' : 'S-L', - \ "\<C-s>": 'S-B', - \ 't': 'T', - \ }, - \ 'tabline': { - \ 'left': [['tabs']], - \ 'right': [], - \ }, - \ 'tab': { - \ 'active': ['tabnum', 'filename', 'modified'], - \ 'inactive': ['tabnum', 'filename', 'modified'], - \ }, - \ } - -function! Lightline_mode() - " Calling `eskk#statusline()` makes Vim autoload eskk. If you call it - " without checking `g:loaded_autoload_eskk`, eskk is loaded on an early - " stage of the initialization (probably the first rendering of status line), - " which slows down Vim startup. Loading eskk can be delayed by checking both - " of `g:loaded_eskk` and `g:loaded_autoload_eskk`. - if exists('g:loaded_eskk') && exists('g:loaded_autoload_eskk') - let skk = eskk#statusline(' (%s)', '') - else - let skk = '' - endif - return lightline#mode() . skk -endfunction - -function! Lightline_linenum() - return line('.') . '/' . line('$') -endfunction - -function! Lightline_fileformat() - if &fileformat ==# 'unix' - return 'LF' - elseif &fileformat ==# 'dos' - return 'CRLF' - elseif &fileformat ==# 'mac' - return 'CR' - else - return '-' - endif -endfunction - - - -" vim-lsp {{{2 - -" TODO - - - -" niceblock {{{2 - -xmap I <Plug>(niceblock-I) -xmap gI <Plug>(niceblock-gI) -xmap A <Plug>(niceblock-A) - - - - - - -" operator-replace {{{2 - -nmap <C-p> <Plug>(operator-replace) -omap <C-p> <Plug>(operator-replace) -xmap <C-p> <Plug>(operator-replace) - - - -" operator-search {{{2 - -" Note: m/ is the prefix of comment out. -nmap m? <Plug>(operator-search) -omap m? <Plug>(operator-search) -xmap m? <Plug>(operator-search) - - - -" prettyprint {{{2 - -let g:prettyprint_indent = 2 -let g:prettyprint_string = ['split'] -let g:prettyprint_show_expression = 1 - - - -" qfreplace {{{2 - -nnoremap <silent> br :<C-u>Qfreplace SmartOpen<CR> - - - -" quickhl {{{2 - -" TODO: CUI -let g:quickhl_manual_colors = [ - \ 'guifg=#101020 guibg=#8080c0 gui=bold', - \ 'guifg=#101020 guibg=#80c080 gui=bold', - \ 'guifg=#101020 guibg=#c08080 gui=bold', - \ 'guifg=#101020 guibg=#80c0c0 gui=bold', - \ 'guifg=#101020 guibg=#c0c080 gui=bold', - \ 'guifg=#101020 guibg=#a0a0ff gui=bold', - \ 'guifg=#101020 guibg=#a0ffa0 gui=bold', - \ 'guifg=#101020 guibg=#ffa0a0 gui=bold', - \ 'guifg=#101020 guibg=#a0ffff gui=bold', - \ 'guifg=#101020 guibg=#ffffa0 gui=bold', - \ ] - -nmap " <Plug>(quickhl-manual-this) -xmap " <Plug>(quickhl-manual-this) -nnoremap <silent> <C-c> :<C-u>nohlsearch <Bar> QuickhlManualReset<CR> - - - -" quickrun {{{2 - -let g:quickrun_no_default_key_mappings = 1 - -if !exists('g:quickrun_config') - let g:quickrun_config = {} -endif -let g:quickrun_config.cpp = { - \ 'cmdopt': '--std=c++17 -Wall -Wextra', - \ } -let g:quickrun_config.d = { - \ 'exec': 'dub run', - \ } -let g:quickrun_config.haskell = { - \ 'exec': ['stack build', 'stack exec %{matchstr(globpath(".,..,../..,../../..", "*.cabal"), "\\w\\+\\ze\\.cabal")}'], - \ } -let g:quickrun_config.python = { - \ 'command': 'python3', - \ } - - -nmap BB <Plug>(quickrun) -xmap BB <Plug>(quickrun) -" nnoremap BB make<CR> - - - - -" repeat {{{2 - -nmap U <Plug>(RepeatRedo) -" Autoload vim-repeat immediately in order to make <Plug>(RepeatRedo) available. -" repeat#setreg() does nothing here. -call repeat#setreg('', '') - - -" Make them repeatable with vim-repeat. -nnoremap <silent> <Plug>(my-insert-blank-lines-after) - \ :<C-u>call <SID>insert_blank_line(0)<Bar> - \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-after)")<CR> -nnoremap <silent> <Plug>(my-insert-blank-lines-before) - \ :<C-u>call <SID>insert_blank_line(1)<Bar> - \ silent! call repeat#set("\<Lt>Plug>(my-insert-blank-lines-before)")<CR> - - - -" ripgrep {{{2 - -" Workaround: do not open quickfix window. -" exe g:rg_window_location 'copen' -let g:rg_window_location = 'silent! echo' -let g:rg_jump_to_first = 1 - -command! -bang -nargs=* -complete=file -bar - \ RG - \ Rg<bang> <args> - - -" rust {{{2 - -let g:rustfmt_autosave = 1 - - - - -" sandwich {{{2 - - - - - - -" splitjoin {{{2 - -" Note: Don't use J{any sign}, 'Jl' and 'JL'. They will conflict with 'vim-jplus'. -let g:splitjoin_split_mapping = '' -let g:splitjoin_join_mapping = '' - -nnoremap <silent> JS :<C-u>SplitjoinSplit<CR> -nnoremap <silent> JJ :<C-u>SplitjoinJoin<CR> - - - -" submode {{{2 - -" Global settings {{{3 -let g:submode_always_show_submode = 1 -let g:submode_keyseqs_to_leave = ['<C-c>', '<ESC>'] -let g:submode_keep_leaving_key = 1 - -" yankround {{{3 -call submode#enter_with('YankRound', 'nv', 'rs', 'gp', '<Plug>(yankround-p)') -call submode#enter_with('YankRound', 'nv', 'rs', 'gP', '<Plug>(yankround-P)') -call submode#map('YankRound', 'nv', 'rs', 'p', '<Plug>(yankround-prev)') -call submode#map('YankRound', 'nv', 'rs', 'P', '<Plug>(yankround-next)') - -" swap {{{3 -call submode#enter_with('Swap', 'n', 'r', 'g>', '<Plug>(swap-next)') -call submode#map('Swap', 'n', 'r', '<', '<Plug>(swap-prev)') -call submode#enter_with('Swap', 'n', 'r', 'g<', '<Plug>(swap-prev)') -call submode#map('Swap', 'n', 'r', '>', '<Plug>(swap-next)') - -" Resizing a window (height) {{{3 -call submode#enter_with('WinResizeH', 'n', '', 'trh') -call submode#enter_with('WinResizeH', 'n', '', 'trh') -call submode#map('WinResizeH', 'n', '', '+', '<C-w>+') -call submode#map('WinResizeH', 'n', '', '-', '<C-w>-') - -" Resizing a window (width) {{{3 -call submode#enter_with('WinResizeW', 'n', '', 'trw') -call submode#enter_with('WinResizeW', 'n', '', 'trw') -call submode#map('WinResizeW', 'n', '', '+', '<C-w>>') -call submode#map('WinResizeW', 'n', '', '-', '<C-w><Lt>') - -" Super undo/redo {{{3 -call submode#enter_with('Undo/Redo', 'n', '', 'gu', 'g-') -call submode#map('Undo/Redo', 'n', '', 'u', 'g-') -call submode#enter_with('Undo/Redo', 'n', '', 'gU', 'g+') -call submode#map('Undo/Redo', 'n', '', 'U', 'g+') - - - -" swap {{{2 - -let g:swap_no_default_key_mappings = 1 - - - -" textobj-continuousline {{{2 - -let g:textobj_continuous_line_no_default_key_mappings = 1 - -omap aL <Plug>(textobj-continuous-cpp-a) -xmap aL <Plug>(textobj-continuous-cpp-a) -omap iL <Plug>(textobj-continuous-cpp-i) -xmap iL <Plug>(textobj-continuous-cpp-i) - -Autocmd FileType vim omap <buffer> aL <Plug>(textobj-continuous-vim-a) -Autocmd FileType vim xmap <buffer> aL <Plug>(textobj-continuous-vim-a) -Autocmd FileType vim omap <buffer> iL <Plug>(textobj-continuous-vim-i) -Autocmd FileType vim xmap <buffer> iL <Plug>(textobj-continuous-vim-i) - - - -" textobj-lastpaste {{{2 - -let g:textobj_lastpaste_no_default_key_mappings = 1 - -omap iP <Plug>(textobj-lastpaste-i) -xmap iP <Plug>(textobj-lastpaste-i) -omap aP <Plug>(textobj-lastpaste-a) -xmap aP <Plug>(textobj-lastpaste-a) - - - -" textobj-space {{{2 - -let g:textobj_space_no_default_key_mappings = 1 - -omap a<Space> <Plug>(textobj-space-a) -xmap a<Space> <Plug>(textobj-space-a) -omap i<Space> <Plug>(textobj-space-i) -xmap i<Space> <Plug>(textobj-space-i) - - -" textobj-wiw {{{2 - -let g:textobj_wiw_no_default_key_mappings = 1 - -nmap <C-w> <Plug>(textobj-wiw-n) -omap <C-w> <Plug>(textobj-wiw-n) -xmap <C-w> <Plug>(textobj-wiw-n) -nmap g<C-w> <Plug>(textobj-wiw-p) -omap g<C-w> <Plug>(textobj-wiw-p) -xmap g<C-w> <Plug>(textobj-wiw-p) -nmap <C-e> <Plug>(textobj-wiw-N) -omap <C-e> <Plug>(textobj-wiw-N) -xmap <C-e> <Plug>(textobj-wiw-N) -nmap g<C-e> <Plug>(textobj-wiw-P) -omap g<C-e> <Plug>(textobj-wiw-P) -xmap g<C-e> <Plug>(textobj-wiw-P) - -omap a<C-w> <Plug>(textobj-wiw-a) -xmap a<C-w> <Plug>(textobj-wiw-a) -omap i<C-w> <Plug>(textobj-wiw-i) -xmap i<C-w> <Plug>(textobj-wiw-i) - - - -" window-adjuster {{{2 - -nnoremap <silent> tRw :<C-u>AdjustScreenWidth<CR> -nnoremap <silent> tRh :<C-u>AdjustScreenHeight<CR> -nnoremap <silent> tRr :<C-u>AdjustScreenWidth <Bar> AdjustScreenHeight<CR> - - - - - -" yankround {{{2 - -let g:yankround_dir = g:MY_ENV.yankround_dir -let g:yankround_use_region_hl = 1 - - - - - - - - - - - -" Utilities {{{1 - -"" Wrapper of |getchar()|. -function! s:getchar() - let ch = getchar() - while ch == "\<CursorHold>" - let ch = getchar() - endwhile - return type(ch) == v:t_number ? nr2char(ch) : ch -endfunction - - -"" Wrapper of |:echo| and |:echohl|. -function! s:echo(message, ...) abort - let highlight = get(a:000, 0, 'None') - redraw - execute 'echohl' highlight - echo a:message - echohl None -endfunction - - -"" Wrapper of |getchar()|. -function! s:getchar_with_prompt(prompt) abort - call s:echo(a:prompt) - return s:getchar() -endfunction - - -"" Wrapper of |input()|. -"" Only when it is used in a mapping, |inputsave()| and |inputstore()| are -"" required. -function! s:input(...) abort - call inputsave() - let result = call('input', a:000) - call inputrestore() - return result -endfunction - - -"" Wrapper of |win_screenpos()|, |winheight()| and |winwidth()|. -"" Returns quadruple consisting of y, x, width and height. -function! s:win_getrect(...) abort - let win = get(a:000, 0, 0) - let [y, x] = win_screenpos(win) - let h = winheight(win) - let w = winwidth(win) - return [y, x, h, w] -endfunction - - - -" Modelines {{{1 -" vim: expandtab:softtabstop=4:shiftwidth=4:textwidth=80:colorcolumn=+1: -" vim: foldenable:foldmethod=marker:foldlevel=0: diff --git a/.config/nvim/plugged b/.config/nvim/plugged deleted file mode 120000 index 13b61af..0000000 --- a/.config/nvim/plugged +++ /dev/null @@ -1 +0,0 @@ -../vim/plugged
\ No newline at end of file |
