commit 39e90472d2a138a850c439c62bfa858f1bac591d
parent 216bef6cc96ef6a3b6fbdb10eaae4681df3f3ed5
Author: Alex Balgavy <alex@balgavy.eu>
Date: Wed, 4 Jan 2023 16:52:30 +0100
vim/nvim: various config things
Diffstat:
M | nvim/init.lua | | | 424 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- |
D | nvim/lua/plugins.lua | | | 32 | -------------------------------- |
M | vim/vimrc | | | 131 | ++++++++++++++++++++++++++++++++++++++++++------------------------------------- |
3 files changed, 445 insertions(+), 142 deletions(-)
diff --git a/nvim/init.lua b/nvim/init.lua
@@ -1,73 +1,401 @@
vim.cmd([[
set runtimepath^=~/.vim runtimepath+=~/.vim/after
let &packpath = &runtimepath
-source ~/.vim/vimrc
+call setenv("MYOLDVIMRC", "~/.vim/vimrc")
+source $MYOLDVIMRC
]])
--- neovim plugins
-require('plugins')
+-- Install packer
+local install_path = vim.fn.stdpath 'data' .. '/site/pack/packer/start/packer.nvim'
+local is_bootstrap = false
+if vim.fn.empty(vim.fn.glob(install_path)) > 0 then
+ is_bootstrap = true
+ vim.fn.system { 'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path }
+ vim.cmd [[packadd packer.nvim]]
+end
+
+require('packer').startup(function(use)
+ -- Package manager
+ use 'wbthomason/packer.nvim'
+
+ use { -- LSP Configuration & Plugins
+ 'neovim/nvim-lspconfig',
+ requires = {
+ -- Automatically install LSPs to stdpath for neovim
+ 'williamboman/mason.nvim',
+ 'williamboman/mason-lspconfig.nvim',
+
+ -- Useful status updates for LSP
+ 'j-hui/fidget.nvim',
+
+ -- Additional lua configuration, makes nvim stuff amazing
+ 'folke/neodev.nvim',
+ },
+ }
+
+ use { -- Autocompletion
+ 'hrsh7th/nvim-cmp',
+ requires = { 'hrsh7th/cmp-nvim-lsp', 'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip' },
+ }
+
+ use { -- Highlight, edit, and navigate code
+ 'nvim-treesitter/nvim-treesitter',
+ run = function()
+ pcall(require('nvim-treesitter.install').update { with_sync = true })
+ end,
+ }
+
+ use { -- Additional text objects via treesitter
+ 'nvim-treesitter/nvim-treesitter-textobjects',
+ after = 'nvim-treesitter',
+ }
+
+ -- Git related plugins
+ use 'lewis6991/gitsigns.nvim'
+
+ use 'lukas-reineke/indent-blankline.nvim' -- Add indentation guides even on blank lines
+ use 'numToStr/Comment.nvim' -- "gc" to comment visual regions/lines
-local custom_lsp_attach = function(client)
- -- See `:help nvim_buf_set_keymap()` for more information
- vim.api.nvim_buf_set_keymap(0, 'n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>', {noremap = true})
- vim.api.nvim_buf_set_keymap(0, 'n', '<c-]>', '<cmd>lua vim.lsp.buf.definition()<CR>', {noremap = true})
+ -- Fuzzy Finder (files, lsp, etc)
+ use { 'nvim-telescope/telescope.nvim', branch = '0.1.x', requires = { 'nvim-lua/plenary.nvim' } }
- -- Use LSP as the handler for omnifunc.
- vim.api.nvim_buf_set_option(0, 'omnifunc', 'v:lua.vim.lsp.omnifunc')
+ -- Fuzzy Finder Algorithm which requires local dependencies to be built. Only load if `make` is available
+ use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make', cond = vim.fn.executable 'make' == 1 }
- -- Use LSP as the handler for formatexpr.
- vim.api.nvim_buf_set_option(0, 'formatexpr', 'v:lua.vim.lsp.formatexpr()')
+ -- Linting - for when LSP is not enough
+ use 'mfussenegger/nvim-lint'
- -- For plugins with an `on_attach` callback, call them here. For example:
- -- require('completion').on_attach()
+ -- Add custom plugins to packer from ~/.config/nvim/lua/custom/plugins.lua
+ local has_plugins, plugins = pcall(require, 'custom.plugins')
+ if has_plugins then
+ plugins(use)
+ end
+
+ if is_bootstrap then
+ require('packer').sync()
+ end
+end)
+
+-- When we are bootstrapping a configuration, it doesn't
+-- make sense to execute the rest of the init.lua.
+--
+-- You'll need to restart nvim, and then it will work.
+if is_bootstrap then
+ print '=================================='
+ print ' Plugins are being installed'
+ print ' Wait until Packer completes,'
+ print ' then restart nvim'
+ print '=================================='
+ return
end
-require'lspconfig'.rust_analyzer.setup({
- on_attach = custom_lsp_attach
+-- Automatically source and re-compile packer whenever you save this init.lua
+local packer_group = vim.api.nvim_create_augroup('Packer', { clear = true })
+vim.api.nvim_create_autocmd('BufWritePost', {
+ command = 'source <afile> | PackerCompile',
+ group = packer_group,
+ pattern = vim.fn.expand '$MYVIMRC',
})
-vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, {noremap = true})
-vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, {noremap = true})
-vim.keymap.set('n', ']d', vim.diagnostic.goto_next, {noremap = true})
-vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, {noremap = true})
-require'lspconfig'.pyright.setup{}
+-- [[ Setting options ]]
+-- See `:help vim.o`
-require'lint'.linters_by_ft = {
- -- python = {'flake8',},
- sh = {'shellcheck',}
-}
-vim.api.nvim_create_autocmd({ "BufWritePost" }, {
+-- Set completeopt to have a better completion experience
+vim.o.completeopt = 'menuone,noselect'
+
+-- [[ Basic Keymaps ]]
+-- Set <space> as the leader key
+-- See `:help mapleader`
+-- NOTE: Must happen before plugins are required (otherwise wrong leader will be used)
+vim.g.mapleader = ' '
+vim.g.maplocalleader = ' '
+
+-- Keymaps for better default experience
+-- See `:help vim.keymap.set()`
+vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true })
+
+-- [[ Highlight on yank ]]
+-- See `:help vim.highlight.on_yank()`
+local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true })
+vim.api.nvim_create_autocmd('TextYankPost', {
callback = function()
- require("lint").try_lint()
+ vim.highlight.on_yank()
end,
+ group = highlight_group,
+ pattern = '*',
})
-require'nvim-treesitter.configs'.setup {
- -- Automatically install missing parsers when entering buffer
- auto_install = true,
- -- Consistent syntax highlighting
- highlight = {
- enable = true,
- -- Setting this to true will run `:h syntax` and tree-sitter at the same time.
- -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation).
- -- Using this option may slow down your editor, and you may see some duplicate highlights.
- -- Instead of true it can also be a list of languages
- additional_vim_regex_highlighting = false,
+-- Enable Comment.nvim
+require('Comment').setup()
+
+-- Enable `lukas-reineke/indent-blankline.nvim`
+-- See `:help indent_blankline.txt`
+require('indent_blankline').setup {
+ char = '┊',
+ show_trailing_blankline_indent = false,
+ filetype = {'python'},
+}
+
+-- Gitsigns
+-- See `:help gitsigns.txt`
+require('gitsigns').setup {
+ signs = {
+ add = { text = '+' },
+ change = { text = '~' },
+ delete = { text = '_' },
+ topdelete = { text = '‾' },
+ changedelete = { text = '~' },
+ },
+}
+
+-- [[ Configure Telescope ]]
+-- See `:help telescope` and `:help telescope.setup()`
+require('telescope').setup {
+ defaults = {
+ mappings = {
+ i = {
+ ['<C-u>'] = false,
+ ['<C-d>'] = false,
+ },
+ },
},
+}
+
+-- Enable telescope fzf native, if installed
+pcall(require('telescope').load_extension, 'fzf')
+
+-- See `:help telescope.builtin`
+vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' })
+vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' })
+vim.keymap.set('n', '<leader>/', function()
+ -- You can pass additional configuration to telescope to change theme, layout, etc.
+ require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown {
+ winblend = 10,
+ previewer = false,
+ })
+end, { desc = '[/] Fuzzily search in current buffer]' })
+
+vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' })
+vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' })
+vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' })
+vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' })
+vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' })
+
+-- [[ Configure Treesitter ]]
+-- See `:help nvim-treesitter`
+require('nvim-treesitter.configs').setup {
+ -- Add languages to be installed here that you want installed for treesitter
+ ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'typescript', 'help', 'vim', 'bash', 'ledger', 'ruby', 'python' },
+
+ highlight = { enable = true },
+ indent = { enable = true, disable = { 'python' } },
incremental_selection = {
enable = true,
keymaps = {
- init_selection = "gnn",
- node_incremental = "grn",
- scope_incremental = "grc",
- node_decremental = "grm",
+ init_selection = '<c-space>',
+ node_incremental = '<c-space>',
+ scope_incremental = '<c-s>',
+ node_decremental = '<c-backspace>',
+ },
+ },
+ textobjects = {
+ select = {
+ enable = true,
+ lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim
+ keymaps = {
+ -- You can use the capture groups defined in textobjects.scm
+ ['aa'] = '@parameter.outer',
+ ['ia'] = '@parameter.inner',
+ ['af'] = '@function.outer',
+ ['if'] = '@function.inner',
+ ['ac'] = '@class.outer',
+ ['ic'] = '@class.inner',
+ },
+ },
+ move = {
+ enable = true,
+ set_jumps = true, -- whether to set jumps in the jumplist
+ goto_next_start = {
+ [']m'] = '@function.outer',
+ [']]'] = '@class.outer',
+ },
+ goto_next_end = {
+ [']M'] = '@function.outer',
+ [']['] = '@class.outer',
+ },
+ goto_previous_start = {
+ ['[m'] = '@function.outer',
+ ['[['] = '@class.outer',
+ },
+ goto_previous_end = {
+ ['[M'] = '@function.outer',
+ ['[]'] = '@class.outer',
+ },
+ },
+ swap = {
+ enable = true,
+ swap_next = {
+ ['<leader>a'] = '@parameter.inner',
+ },
+ swap_previous = {
+ ['<leader>A'] = '@parameter.inner',
+ },
},
},
- indent = {
- enable = true
- }
}
-vim.cmd([[
-set foldmethod=expr
-set foldexpr=nvim_treesitter#foldexpr()
-]])
+
+-- Diagnostic keymaps
+vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
+vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
+vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float)
+vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist)
+
+-- LSP settings.
+-- This function gets run when an LSP connects to a particular buffer.
+local on_attach = function(_, bufnr)
+ -- NOTE: Remember that lua is a real programming language, and as such it is possible
+ -- to define small helper and utility functions so you don't have to repeat yourself
+ -- many times.
+ --
+ -- In this case, we create a function that lets us more easily define mappings specific
+ -- for LSP related items. It sets the mode, buffer and description for us each time.
+ local nmap = function(keys, func, desc)
+ if desc then
+ desc = 'LSP: ' .. desc
+ end
+
+ vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc })
+ end
+
+ nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame')
+ nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction')
+
+ nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition')
+ nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences')
+ nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation')
+ nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition')
+ nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols')
+ nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols')
+
+ -- See `:help K` for why this keymap
+ nmap('K', vim.lsp.buf.hover, 'Hover Documentation')
+ nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation')
+
+ -- Lesser used LSP functionality
+ nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration')
+ nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder')
+ nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder')
+ nmap('<leader>wl', function()
+ print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
+ end, '[W]orkspace [L]ist Folders')
+
+ -- Create a command `:Format` local to the LSP buffer
+ vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
+ vim.lsp.buf.format()
+ end, { desc = 'Format current buffer with LSP' })
+end
+
+-- Enable the following language servers
+-- Feel free to add/remove any LSPs that you want here. They will automatically be installed.
+-- https://github.com/williamboman/mason-lspconfig.nvim/blob/main/doc/server-mapping.md
+-- Add any additional override configuration in the following tables. They will be passed to
+-- the `settings` field of the server config. You must look up that documentation yourself.
+local servers = {
+ -- clangd = {},
+ -- gopls = {},
+ -- tsserver = {},
+ ruby_ls = {},
+ rust_analyzer = {},
+ bashls = {},
+ pyright = {},
+ sumneko_lua = {
+ Lua = {
+ workspace = { checkThirdParty = false },
+ telemetry = { enable = false },
+ },
+ },
+}
+
+-- Setup neovim lua configuration
+require('neodev').setup()
+--
+-- nvim-cmp supports additional completion capabilities, so broadcast that to servers
+local capabilities = vim.lsp.protocol.make_client_capabilities()
+capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
+
+-- Setup mason so it can manage external tooling
+require('mason').setup()
+
+-- Ensure the servers above are installed
+local mason_lspconfig = require 'mason-lspconfig'
+
+mason_lspconfig.setup {
+ ensure_installed = vim.tbl_keys(servers),
+}
+
+mason_lspconfig.setup_handlers {
+ function(server_name)
+ require('lspconfig')[server_name].setup {
+ capabilities = capabilities,
+ on_attach = on_attach,
+ settings = servers[server_name],
+ }
+ end,
+}
+
+-- Turn on lsp status information
+require('fidget').setup()
+
+-- nvim-cmp setup
+local cmp = require 'cmp'
+require("luasnip.loaders.from_snipmate").lazy_load({paths="~/.dotfiles/vim/snippets"})
+local luasnip = require 'luasnip'
+
+cmp.setup {
+ snippet = {
+ expand = function(args)
+ luasnip.lsp_expand(args.body)
+ end,
+ },
+ mapping = cmp.mapping.preset.insert {
+ ['<C-d>'] = cmp.mapping.scroll_docs(-4),
+ ['<C-f>'] = cmp.mapping.scroll_docs(4),
+ ['<C-Space>'] = cmp.mapping.complete(),
+ ['<CR>'] = cmp.mapping.confirm {
+ behavior = cmp.ConfirmBehavior.Replace,
+ select = true,
+ },
+ ['<Tab>'] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_next_item()
+ elseif luasnip.expand_or_jumpable() then
+ luasnip.expand_or_jump()
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ ['<S-Tab>'] = cmp.mapping(function(fallback)
+ if cmp.visible() then
+ cmp.select_prev_item()
+ elseif luasnip.jumpable(-1) then
+ luasnip.jump(-1)
+ else
+ fallback()
+ end
+ end, { 'i', 's' }),
+ },
+ sources = {
+ { name = 'nvim_lsp' },
+ { name = 'luasnip' },
+ },
+}
+
+-- linting
+require('lint').linters_by_ft = {
+ sh = {'shellcheck'},
+}
+vim.api.nvim_create_autocmd({ "BufWritePost" }, {
+ callback = function()
+ require("lint").try_lint()
+ end,
+})
diff --git a/nvim/lua/plugins.lua b/nvim/lua/plugins.lua
@@ -1,32 +0,0 @@
-local ensure_packer = function()
- local fn = vim.fn
- local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim'
- if fn.empty(fn.glob(install_path)) > 0 then
- fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path})
- vim.cmd [[packadd packer.nvim]]
- return true
- end
- return false
-end
-
-local packer_bootstrap = ensure_packer()
-
-return require('packer').startup(function(use)
- -- Packer can manage itself
- use 'wbthomason/packer.nvim'
- use 'neovim/nvim-lspconfig'
- use {
- 'nvim-treesitter/nvim-treesitter',
- run = function()
- local ts_update = require('nvim-treesitter.install').update({ with_sync = true })
- ts_update()
- end,
- }
- use 'mfussenegger/nvim-lint'
-
- -- Automatically set up your configuration after cloning packer.nvim
- -- Put this at the end after all plugins
- if packer_bootstrap then
- require('packer').sync()
- end
-end)
diff --git a/vim/vimrc b/vim/vimrc
@@ -1,5 +1,6 @@
" vim: foldmethod=marker foldlevel=0
let mapleader=" " " Set the mapleader to be space
+let maplocalleader=" "
" Plugins {{{1
" Installation {{{2
@@ -19,9 +20,6 @@ Plug 'junegunn/vader.vim'
" A color table with xterm color codes
Plug 'guns/xterm-color-table.vim'
-" Simple commenting
-Plug 'tpope/vim-commentary'
-
" Faster HTML
Plug 'mattn/emmet-vim', { 'for': ['html', 'css', 'markdown'] }
@@ -69,13 +67,6 @@ Plug 'romainl/vim-cool'
" Vim + latex
Plug 'lervag/vimtex'
-" Snippets
-Plug 'SirVer/ultisnips'
-
-" Fuzzy finder in vim
-Plug 'junegunn/fzf', { 'dir': '$HOME/.dotfiles/tools/fzf', 'do': './install --all --xdg --no-fish'}
-Plug 'junegunn/fzf.vim'
-
" Better abbrevation and substitution
Plug 'tpope/vim-abolish'
@@ -85,9 +76,6 @@ Plug 'chrisbra/colorizer'
" Pywal scheme in vim
Plug 'dylanaraps/wal.vim'
-" Show git changes in the sign column
-Plug 'airblade/vim-gitgutter'
-
" Bracket bindings for filetypes
Plug 'arp242/jumpy.vim'
@@ -149,8 +137,6 @@ Plug 'skanehira/gh.vim'
" Minesweeper
Plug 'iqxd/vim-mine-sweeping'
-Plug 'Yggdroot/indentLine', { 'for': 'python' }
-
Plug 'jceb/vim-orgmode', { 'for': 'org' }
" Rust
@@ -165,8 +151,23 @@ if !has('nvim')
Plug 'markonm/traces.vim'
Plug 'dense-analysis/ale'
+
+ " Show git changes in the sign column
+ Plug 'airblade/vim-gitgutter'
+
+ Plug 'Yggdroot/indentLine', { 'for': 'python' }
+
+ " Simple commenting
+ Plug 'tpope/vim-commentary'
+
+ " Fuzzy finder in vim
+ Plug 'junegunn/fzf', { 'dir': '$HOME/.dotfiles/tools/fzf', 'do': './install --all --xdg --no-fish'}
+ Plug 'junegunn/fzf.vim'
+
endif
+" Snippets
+Plug 'SirVer/ultisnips'
call plug#end()
" quickfix filtering
@@ -304,55 +305,57 @@ set completefunc=ultisnips_complete#ListSnippets
" NOTE: performance improvement. autotrigger leads to slow typing in markdown
" mode.
augroup ultisnips_no_auto_expansion
- au!
- au VimEnter * au! UltiSnips_AutoTrigger
+ au!
+ au VimEnter * au! UltiSnips_AutoTrigger
augroup END
" Abolish {{{3
" Work with variants of words easily
let g:abolish_save_file = '"$HOME"/.dotfiles/vim/abolish_save_file.vim'
" Fzf {{{3
-set rtp+="$HOME"/.dotfiles/tools/fzf
-function! s:build_quickfix_list(lines)
- call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
- copen
- cc
-endfunction
-let g:fzf_action = {
- \ 'ctrl-f': function('s:build_quickfix_list'),
- \ 'ctrl-t': 'tabedit',
- \ 'ctrl-p': 'split',
- \ 'ctrl-v': 'vsplit' }
-let g:fzf_layout = {'window': { 'width': 0.9, 'height': 0.4 } }
-let g:fzf_preview_window = 'right:60%'
-" Jump to existing buffer/window if possible
-let g:fzf_buffers_jump = 1
-
-nnoremap <leader>F :Files<CR>
-nnoremap <leader><c-f><c-f> :Files<space>
-nnoremap <expr> <leader><c-f>. ":Files " .. expand("%:h") .. "<CR>"
-nnoremap <leader>B :Buffers<CR>
-nnoremap <leader>G :Lines<CR>
-nnoremap <leader>W :BLines<CR>
-nnoremap <expr> <leader>Z ':BLines '..&foldmarker->split(',')[0]..'<CR>'
-nnoremap <leader>? :Helptags<CR>
-nnoremap <leader>T :Tags<CR>
-nnoremap <leader>/ :Ag<CR>
-nnoremap <leader>M :Marks<CR>
-nnoremap <leader>; :History:<CR>
-
-" My extensions
-nmap <leader>J <Plug>FzfChangesJumpsJumps
-nmap <leader>C <Plug>FzfChangesJumpsChanges
-
-" Search for Todos/Fixmes
-command! Todo Ag ((TO ?DO)|FIXME):<space>
-nnoremap <leader>! :Todo<CR>
-
-" Set a filetype
-cabbrev setf Filetypes
-
-command! Scripts call fzf#run(fzf#wrap({'source': 'command find "$(readlink ~/.scripts)" -type f -or -type l -not -ipath "*/.git/*"', 'options': '--multi --reverse --inline-info --prompt="scripts> "', 'sink': 'sp'}))
-command! Configs call fzf#run(fzf#wrap({'source': 'command find ~/.dotfiles -type f ! -ipath "*/.git/*" ! -ipath "*/bin/*" ! -ipath "*/oh-my-zsh/*" ! -name ".DS_Store"', 'options': '--multi --reverse --inline-info --prompt="configs> "', 'sink': 'sp'}))
+if exists('g:loaded_fzf')
+ set rtp+="$HOME"/.dotfiles/tools/fzf
+ function! s:build_quickfix_list(lines)
+ call setqflist(map(copy(a:lines), '{ "filename": v:val }'))
+ copen
+ cc
+ endfunction
+ let g:fzf_action = {
+ \ 'ctrl-f': function('s:build_quickfix_list'),
+ \ 'ctrl-t': 'tabedit',
+ \ 'ctrl-p': 'split',
+ \ 'ctrl-v': 'vsplit' }
+ let g:fzf_layout = {'window': { 'width': 0.9, 'height': 0.4 } }
+ let g:fzf_preview_window = 'right:60%'
+ " Jump to existing buffer/window if possible
+ let g:fzf_buffers_jump = 1
+
+ nnoremap <leader>F :Files<CR>
+ nnoremap <leader><c-f><c-f> :Files<space>
+ nnoremap <expr> <leader><c-f>. ":Files " .. expand("%:h") .. "<CR>"
+ nnoremap <leader>B :Buffers<CR>
+ nnoremap <leader>G :Lines<CR>
+ nnoremap <leader>W :BLines<CR>
+ nnoremap <expr> <leader>Z ':BLines '..&foldmarker->split(',')[0]..'<CR>'
+ nnoremap <leader>? :Helptags<CR>
+ nnoremap <leader>T :Tags<CR>
+ nnoremap <leader>/ :Ag<CR>
+ nnoremap <leader>M :Marks<CR>
+ nnoremap <leader>; :History:<CR>
+
+ " My extensions
+ nmap <leader>J <Plug>FzfChangesJumpsJumps
+ nmap <leader>C <Plug>FzfChangesJumpsChanges
+
+ " Search for Todos/Fixmes
+ command! Todo Ag ((TO ?DO)|FIXME):<space>
+ nnoremap <leader>! :Todo<CR>
+
+ " Set a filetype
+ cabbrev setf Filetypes
+
+ command! Scripts call fzf#run(fzf#wrap({'source': 'command find "$(readlink ~/.scripts)" -type f -or -type l -not -ipath "*/.git/*"', 'options': '--multi --reverse --inline-info --prompt="scripts> "', 'sink': 'sp'}))
+ command! Configs call fzf#run(fzf#wrap({'source': 'command find ~/.dotfiles -type f ! -ipath "*/.git/*" ! -ipath "*/bin/*" ! -ipath "*/oh-my-zsh/*" ! -name ".DS_Store"', 'options': '--multi --reverse --inline-info --prompt="configs> "', 'sink': 'sp'}))
+endif
" Vimwiki {{{3
let tlist_vimwiki_settings = 'wiki;h:Headers'
let g:vimwiki_table_mappings = 0 " avoid vimwiki conflict with Ultisnips
@@ -481,9 +484,11 @@ if exists('g:loaded_ale')
endif
" indentLine {{{3
-let g:indentLine_char_list = ['|', '¦', '┆', '┊']
-let g:indentLine_enable = 0 " off by default
-let g:indentLine_fileType = ['python'] " enable for python
+if !has('nvim')
+ let g:indentLine_char_list = ['|', '¦', '┆', '┊']
+ let g:indentLine_enable = 0 " off by default
+ let g:indentLine_fileType = ['python'] " enable for python
+endif
" Emmet {{{3
let g:user_emmet_settings = {
\ 'markdown': {
@@ -824,6 +829,7 @@ command! Fuckwindows %s/
//g
command! Hexedit %!xxd
command! Unhex %!xxd -r
command! JsonSimplifyObject %s/^\(\s\{10}\){\n\s\{12\}\(.*\)\n\s\{10\}}\(,\?\)/\1{ \2 }\3
+command! UnsmartQuotes silent %s/[“”]/"/ge | %s/[‘’]/'/ge
command! BeautifyJson %!python -m json.tool
command! Dos2unix %!dos2unix
command! -nargs=1 Cheat terminal curl cheat.sh/<args>
@@ -925,6 +931,7 @@ nnoremap <leader><c-l> :syntax sync fromstart<CR>:redraw!<CR>:diffupdate<CR><c-l
" urlview
nnoremap <silent> U :w !urlview<CR>
+nnoremap <leader>U U
" 'zoom to head level'
nnoremap zh mzzt10<c-u>`z