Mercurial
diff vim-setup/.vimrc @ 151:c033667da5f9 hg-web
Merging latest merge into hg-web
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Sat, 10 Jan 2026 13:35:09 -0800 |
| parents | c37490913530 |
| children | 790930d9bb90 |
line wrap: on
line diff
--- a/vim-setup/.vimrc Fri Jan 09 18:39:34 2026 -0800 +++ b/vim-setup/.vimrc Sat Jan 10 13:35:09 2026 -0800 @@ -59,9 +59,13 @@ nnoremap <leader>y "+y vnoremap <leader>y "+y -" FZF -" Add fzf to runtimepath -set rtp += ~/.fzf +command! -bang -nargs=* RG + \ call fzf#vim#grep( + \ 'rg --column --line-number --no-heading --color=always --smart-case --hidden '.shellescape(<q-args>), + \ 1, + \ fzf#vim#with_preview(), + \ <bang>0) + " <leader>ff: Fuzzy file search nnoremap <leader>ff :Files<CR> @@ -74,8 +78,25 @@ " <leader>fs: Ripgrep search for word (normal mode) nnoremap <leader>fs :RG<CR> -" <leader>fs: Ripgrep search for selected text (visual mode) -vnoremap <leader>fs :<C-u>execute 'Rg ' . getreg('"')<CR> +" <leader>fs: Open Ripgrep search prompt +nnoremap <leader>fs :RG<CR> + +function! RipgrepCursor(query) + call fzf#vim#grep( + \ 'rg --column --line-number --no-heading --color=always --smart-case -- '.shellescape(a:query), + \ 1, + \ fzf#vim#with_preview(), + \ 0) +endfunction + +" <leader>gr: Search word under cursor (Normal) +nnoremap <silent> <leader>gr :call RipgrepCursor(expand('<cword>'))<CR> + +" <leader>gr: Search selection (Visual) +vnoremap <silent> <leader>gr y:call RipgrepCursor(@@)<CR> + +nnoremap <leader>gd <C-w>} +nnoremap <leader>gD <C-]> " Open man in vim noremap <c-k> :h <cword><cr> @@ -95,117 +116,205 @@ " Turn on man vim mode runtime! ftplugin/man.vim + " Keyword set keywordprg=:Man -" Setup LSP + completion (I will turn on and off depending on sitautions) -lua << EOF -vim.lsp.set_log_level('OFF') +" FZF enbale vim +set rtp+=/opt/homebrew/opt/fzf + +" For some reason it include ( or ) when I use it in here +set iskeyword-=( iskeyword-=) + +" ============================================================================ +" Markdown Clipboard Image Paste +" ============================================================================ +" Configuration: Set your API endpoint URL (leave empty to save locally) +let g:clipboard_image_upload_url = '' + +" Optional: Custom curl options (e.g., for auth headers) +" let g:clipboard_image_curl_opts = '-H "Authorization: Bearer YOUR_TOKEN"' +let g:clipboard_image_curl_opts = '' -local cmp = require('cmp') -local luasnip = require('luasnip') -local lspconfig = require('lspconfig') -local util = require('lspconfig.util') +function! PasteClipboardImage() + if &filetype != 'markdown' + echo "Clipboard image paste only works in markdown files" + return + endif + + if !executable('pngpaste') + echo "Error: pngpaste not found. Install with: brew install pngpaste" + return + endif + + let l:tmpfile = tempname() . '.png' + + let l:result = system('pngpaste ' . shellescape(l:tmpfile) . ' 2>&1') + + if v:shell_error != 0 + echo "No image in clipboard or pngpaste failed: " . l:result + return + endif + + if !filereadable(l:tmpfile) + echo "Failed to save clipboard image" + return + endif --- ────────────────────────────── --- nvim-cmp setup (unchanged) --- ────────────────────────────── -cmp.setup({ - snippet = { - expand = function(args) luasnip.lsp_expand(args.body) end, - }, - mapping = cmp.mapping.preset.insert({ - ['<C-Space>'] = cmp.mapping.complete(), - ['<CR>'] = cmp.mapping.confirm({ select = true }), - ['<C-J>'] = cmp.mapping.select_next_item(), - ['<C-K>'] = cmp.mapping.select_prev_item(), - }), - sources = cmp.config.sources({ - { name = 'nvim_lsp', group_index = 1 }, - { name = 'luasnip', group_index = 1 }, - { name = 'buffer', group_index = 2 }, - }) -}) + if g:clipboard_image_upload_url == '' + let l:dir = expand('%:p:h') + let l:random = localtime() . '_' . rand() + let l:filename = 'image_' . l:random . '.png' + let l:filepath = l:dir . '/' . l:filename + + call rename(l:tmpfile, l:filepath) -local capabilities = require('cmp_nvim_lsp').default_capabilities() + if !filereadable(l:filepath) + echo "Failed to save image locally" + call delete(l:tmpfile) + return + endif + + let l:url = l:filename + echo "Image saved locally: " . l:filename + else + echo "Uploading image..." --- ts_ls -lspconfig.ts_ls.setup({ - capabilities = capabilities, - root_dir = require('lspconfig.util').root_pattern('tsconfig.json'), - init_options = { - maxTsServerMemory = 8192, - preferences = { - includePackageJsonAutoImports = "auto", - }, - }, - filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact" }, - settings = { - typescript = { - inlayHints = { - includeInlayParameterNameHints = "all", - includeInlayParameterNameHintsWhenArgumentMatchesName = false, - includeInlayFunctionParameterTypeHints = true, - includeInlayVariableTypeHints = true, - includeInlayPropertyDeclarationTypeHints = true, - includeInlayFunctionLikeReturnTypeHints = true, - includeInlayEnumMemberValueHints = true, - }, - }, - }, + let l:curl_cmd = 'curl -s -X POST' + let l:curl_cmd .= ' -H "Content-Type: image/png"' + let l:curl_cmd .= ' --data-binary @' . shellescape(l:tmpfile) + if g:clipboard_image_curl_opts != '' + let l:curl_cmd .= ' ' . g:clipboard_image_curl_opts + endif + let l:curl_cmd .= ' ' . shellescape(g:clipboard_image_upload_url) + + let l:url = system(l:curl_cmd) + + call delete(l:tmpfile) + + if v:shell_error != 0 + echo "Upload failed: " . l:url + return + endif + + let l:url = substitute(l:url, '^\s*\(.\{-}\)\s*$', '\1', '') + echo "Image uploaded!" + endif + + " Insert markdown image syntax at cursor + execute "normal! a" . l:markdown_img . "\<Esc>" +endfunction + +autocmd FileType markdown nnoremap <buffer> <leader>p :call PasteClipboardImage()<CR> - -- Force tsserver to reload the tsconfig every time (fixes 95% of path alias issues) - on_attach = function(client, bufnr) - -- Optional: show when LSP attaches - print("ts_ls attached to " .. vim.fn.getcwd()) - end, -}) - --- Python -lspconfig.basedpyright.setup({ - capabilities = capabilities, - on_attach = function(client, bufnr) - -- Optional: notify when Python LSP attaches - print("basedpyright attached to " .. vim.fn.getcwd()) - - -- Common LSP keymaps (you can put them once at the bottom instead if you prefer) - -- local bufopts = { noremap = true, silent = true, buffer = bufnr } - -- vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) - -- vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) - -- vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) - -- vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, bufopts) - -- vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, bufopts) - -- vim.keymap.set('n', '\\d', vim.diagnostic.open_float, bufopts) - -- vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, bufopts) - -- vim.keymap.set('n', ']d', vim.diagnostic.goto_next, bufopts) - end, - settings = { - basedpyright = { - analysis = { - autoSearchPaths = true, - useLibraryCodeForTypes = true, - diagnosticMode = "workspace", -- or "openFiles" if you have huge monorepos - typeCheckingMode = "standard", -- "strict" if you want maximum strictness - }, - }, - }, - root_dir = util.root_pattern( - "venv", -- This is what I mostly use - "pyproject.toml", -- belows are whatever they use I guess - "setup.py", - "setup.cfg", - "requirements.txt", - ".git" - ), -}) - -EOF - -" Optional key mappings for LSP -nnoremap <silent> gd <cmd>lua vim.lsp.buf.definition()<CR> -nnoremap <silent> K <cmd>lua vim.lsp.buf.hover()<CR> -nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR> -nnoremap <silent> \d <cmd>lua vim.diagnostic.open_float(nil, { border = "rounded" })<CR> -nnoremap <silent> [d <cmd>lua vim.diagnostic.goto_prev()<CR> -nnoremap <silent> ]d <cmd>lua vim.diagnostic.goto_next()<CR> -nnoremap <silent> \ca <cmd>lua vim.lsp.buf.code_action()<CR> +" Setup LSP + completion (I will turn on and off depending on sitautions) +" lua << EOF +" vim.lsp.set_log_level('OFF') +" +" local cmp = require('cmp') +" local luasnip = require('luasnip') +" local lspconfig = require('lspconfig') +" local util = require('lspconfig.util') +" +" -- ────────────────────────────── +" -- nvim-cmp setup (unchanged) +" -- ────────────────────────────── +" cmp.setup({ +" snippet = { +" expand = function(args) luasnip.lsp_expand(args.body) end, +" }, +" mapping = cmp.mapping.preset.insert({ +" ['<C-Space>'] = cmp.mapping.complete(), +" ['<CR>'] = cmp.mapping.confirm({ select = true }), +" ['<C-J>'] = cmp.mapping.select_next_item(), +" ['<C-K>'] = cmp.mapping.select_prev_item(), +" }), +" sources = cmp.config.sources({ +" { name = 'nvim_lsp', group_index = 1 }, +" { name = 'luasnip', group_index = 1 }, +" { name = 'buffer', group_index = 2 }, +" }) +" }) +" +" local capabilities = require('cmp_nvim_lsp').default_capabilities() +" +" -- ts_ls +" lspconfig.ts_ls.setup({ +" capabilities = capabilities, +" root_dir = require('lspconfig.util').root_pattern('tsconfig.json'), +" init_options = { +" maxTsServerMemory = 8192, +" preferences = { +" includePackageJsonAutoImports = "auto", +" }, +" }, +" filetypes = { "typescript", "typescriptreact", "javascript", "javascriptreact" }, +" settings = { +" typescript = { +" inlayHints = { +" includeInlayParameterNameHints = "all", +" includeInlayParameterNameHintsWhenArgumentMatchesName = false, +" includeInlayFunctionParameterTypeHints = true, +" includeInlayVariableTypeHints = true, +" includeInlayPropertyDeclarationTypeHints = true, +" includeInlayFunctionLikeReturnTypeHints = true, +" includeInlayEnumMemberValueHints = true, +" }, +" }, +" }, +" +" -- Force tsserver to reload the tsconfig every time (fixes 95% of path alias issues) +" on_attach = function(client, bufnr) +" -- Optional: show when LSP attaches +" print("ts_ls attached to " .. vim.fn.getcwd()) +" end, +" }) +" +" -- Python +" lspconfig.basedpyright.setup({ +" capabilities = capabilities, +" on_attach = function(client, bufnr) +" -- Optional: notify when Python LSP attaches +" print("basedpyright attached to " .. vim.fn.getcwd()) +" +" -- Common LSP keymaps (you can put them once at the bottom instead if you prefer) +" -- local bufopts = { noremap = true, silent = true, buffer = bufnr } +" -- vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) +" -- vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) +" -- vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) +" -- vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, bufopts) +" -- vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, bufopts) +" -- vim.keymap.set('n', '\\d', vim.diagnostic.open_float, bufopts) +" -- vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, bufopts) +" -- vim.keymap.set('n', ']d', vim.diagnostic.goto_next, bufopts) +" end, +" settings = { +" basedpyright = { +" analysis = { +" autoSearchPaths = true, +" useLibraryCodeForTypes = true, +" diagnosticMode = "workspace", -- or "openFiles" if you have huge monorepos +" typeCheckingMode = "standard", -- "strict" if you want maximum strictness +" }, +" }, +" }, +" root_dir = util.root_pattern( +" "venv", -- This is what I mostly use +" "pyproject.toml", -- belows are whatever they use I guess +" "setup.py", +" "setup.cfg", +" "requirements.txt", +" ".git" +" ), +" }) +" +" EOF +" +" " Optional key mappings for LSP +" nnoremap <silent> gd <cmd>lua vim.lsp.buf.definition()<CR> +" nnoremap <silent> K <cmd>lua vim.lsp.buf.hover()<CR> +" nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR> +" nnoremap <silent> \d <cmd>lua vim.diagnostic.open_float(nil, { border = "rounded" })<CR> +" nnoremap <silent> [d <cmd>lua vim.diagnostic.goto_prev()<CR> +" nnoremap <silent> ]d <cmd>lua vim.diagnostic.goto_next()<CR> +" nnoremap <silent> \ca <cmd>lua vim.lsp.buf.code_action()<CR>