view vim-setup/.vimrc @ 163:058de208e640

[Config] Adding os ignore files.
author June Park <parkjune1995@gmail.com>
date Mon, 19 Jan 2026 04:52:02 -0800
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>