view vim-setup/.vimrc @ 279:b3b547563ec7

Add Google connector service and agent wiki Implement the C/Seobeo Google Drive and Gmail connector with encrypted OAuth storage, Zenbu authentication, browser testing, AI tool discovery, chunked HTTP decoding, and Bazel coverage. Consolidate repository guidance into progressive wiki documentation and enforce arena-first allocation for new first-party C code. Co-authored-by: Copilot <[email protected]> Copilot-Session: 84c338fd-0939-4bb3-b7f3-1062eb213e5d
author MrJuneJune <me@mrjunejune.com>
date Mon, 17 Aug 2026 22:22:36 -0700
parents 790930d9bb90
children
line wrap: on
line source

" Line numbers
set number
set relativenumber

" Turn off error
set noerrorbells
set novisualbell
set t_vb=

" Indentation
set tabstop=2
set shiftwidth=2
set expandtab
set autoindent

" Syntax
syntax on
filetype plugin indent on
set termguicolors
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
colorscheme nightfly
" Force turn on  unless it is over 1M LOC
autocmd BufReadPre * if getfsize(expand("%")) > 1000000 | syntax off | endif

" Line wrapping
set nowrap

" Search settings
set ignorecase
set smartcase
set hlsearch
set incsearch

" Cursor line
set cursorline

" Appearance
set termguicolors
set background=dark
set signcolumn=yes

" Backspace behavior
set backspace=indent,eol,start

" Clipboard
set clipboard+=unnamedplus

" Split window behavior
set splitright
set splitbelow
set splitbelow

" General Keymaps
" Map semicolon to colon in normal mode
nnoremap ; :

" Yank into clipboard
nnoremap <leader>y "+y
vnoremap <leader>y "+y

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>

" <leader>fb: Fuzzy search within buffer
nnoremap <leader>fb :Buffers<CR>

" <leader>ft: ctag search 
nnoremap <leader>ft :Tags<CR>

" <leader>fs: Ripgrep search for word (normal mode)
nnoremap <leader>fs :RG<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>

" ctag open in preview
nnoremap <leader>gd <C-w>}

" ctag open
nnoremap <leader>gD <C-]>

" No highlight
nnoremap <leader>nh :noh<CR>

" Search Files
inoremap <C-f> <C-x>


" Open man in vim
noremap <c-k> :h <cword><cr>

" vim wiki
" Set the directory where your wiki pages will be stored
let g:wiki_root = expand('~/wiki/')

" Set wiki syntax and file extensions
let g:wiki_filetypes = ['md', 'wiki']

" Enable global mappings (optional)
let g:wiki_global_mappings = 1

" Enable links to markdown files
let g:wiki_link_extension = '.md'

" Turn on man vim mode
runtime! ftplugin/man.vim

" Keyword
set keywordprg=:Man

" 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 = ''

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

  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)

    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..."

    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>

" 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>