From 89a4e7bbab58c9086bbbeac26cfc33c7551b3543 Mon Sep 17 00:00:00 2001 From: Harish Karumuthil Date: Tue, 5 Jul 2022 22:39:45 +0530 Subject: [PATCH] Variuos updates --- home/.bashrc | 9 + home/.config/nvim/autoload/plug.vim | 571 ++++++++++++++---- home/.config/nvim/init.vim | 44 +- .../plasma-org.kde.plasma.desktop-appletsrc | 196 ++++-- home/.local/Apps/daily-utils/bin/chromium | 2 + .../.local/Apps/daily-utils/bin/hari-tools.sh | 39 +- home/.local/Apps/daily-utils/binaries.lst | 6 +- home/.profile | 5 + 8 files changed, 694 insertions(+), 178 deletions(-) create mode 100755 home/.local/Apps/daily-utils/bin/chromium diff --git a/home/.bashrc b/home/.bashrc index cfcb975..4952e06 100644 --- a/home/.bashrc +++ b/home/.bashrc @@ -49,5 +49,14 @@ nvmLoad(){ [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion } +javaLoad(){ + export JAVA_HOME=/opt/jdk1.8.0_201/jre/ + export PATH="/opt/android-sdk/tools:/opt/android-sdk/tools/bin:$PATH" +} + +androidLoad(){ + export ANDROID_SDK_ROOT=/opt/android-sdk +} + eval "$($HOME/.local/bin/hari-tools.sh setup-autocomplete) hari-tools.sh" . /usr/share/bash-completion/completions/fzf-key-bindings diff --git a/home/.config/nvim/autoload/plug.vim b/home/.config/nvim/autoload/plug.vim index e0dc78f..6a958cb 100644 --- a/home/.config/nvim/autoload/plug.vim +++ b/home/.config/nvim/autoload/plug.vim @@ -25,7 +25,7 @@ " Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } " Plug 'tpope/vim-fireplace', { 'for': 'clojure' } " -" " Using a non-master branch +" " Using a non-default branch " Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } " " " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) @@ -96,11 +96,17 @@ let s:plug_src = 'https://github.com/junegunn/vim-plug.git' let s:plug_tab = get(s:, 'plug_tab', -1) let s:plug_buf = get(s:, 'plug_buf', -1) let s:mac_gui = has('gui_macvim') && has('gui_running') -let s:is_win = has('win32') || has('win64') +let s:is_win = has('win32') let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) let s:vim8 = has('patch-8.0.0039') && exists('*job_start') -let s:me = resolve(expand(':p')) -let s:base_spec = { 'branch': 'master', 'frozen': 0 } +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand(':p')) + set shellslash +else + let s:me = resolve(expand(':p')) +endif +let s:base_spec = { 'branch': '', 'frozen': 0 } let s:TYPE = { \ 'string': type(''), \ 'list': type([]), @@ -110,10 +116,130 @@ let s:TYPE = { let s:loaded = get(s:, 'loaded', {}) let s:triggers = get(s:, 'triggers', {}) +function! s:is_powershell(shell) + return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$' +endfunction + +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + function! plug#begin(...) if a:0 > 0 let s:plug_home_org = a:1 - let home = s:path(fnamemodify(expand(a:1), ':p')) + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) elseif exists('g:plug_home') let home = s:path(g:plug_home) elseif !empty(&rtp) @@ -121,7 +247,7 @@ function! plug#begin(...) else return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') endif - if fnamemodify(home, ':t') ==# 'plugin' && fnamemodify(home, ':h') ==# s:first_rtp + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') endif @@ -139,6 +265,16 @@ function! s:define_commands() if !executable('git') return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell)) + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(0, []) command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(0, []) command! -nargs=0 -bar -bang PlugClean call s:clean(0) @@ -193,9 +329,17 @@ function! s:ask_no_interrupt(...) endtry endfunction +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + function! plug#end() if !exists('g:plugs') - return s:err('Call plug#begin() first') + return s:err('plug#end() called without calling plug#begin() first') endif if exists('#PlugLOD') @@ -214,7 +358,7 @@ function! plug#end() continue endif let plug = g:plugs[name] - if get(s:loaded, name, 0) || !has_key(plug, 'on') && !has_key(plug, 'for') + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') let s:loaded[name] = 1 continue endif @@ -316,7 +460,7 @@ endfunction function! s:git_version_requirement(...) if !exists('s:git_version') - let s:git_version = map(split(split(s:system('git --version'))[2], '\.'), 'str2nr(v:val)') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') endif return s:version_requirement(s:git_version, a:000) endfunction @@ -326,11 +470,11 @@ function! s:progress_opt(base) \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' endfunction -if s:is_win - function! s:rtp(spec) - return s:path(a:spec.dir . get(a:spec, 'rtp', '')) - endfunction +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction +if s:is_win function! s:path(path) return s:trim(substitute(a:path, '/', '\', 'g')) endfunction @@ -342,11 +486,33 @@ if s:is_win function! s:is_local_plug(repo) return a:repo =~? '^[a-z]:\|^[%~]' endfunction -else - function! s:rtp(spec) - return s:dirpath(a:spec.dir . get(a:spec, 'rtp', '')) + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') endfunction + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else function! s:path(path) return s:trim(a:path) endfunction @@ -426,8 +592,8 @@ endfunction function! s:dobufread(names) for name in a:names - let path = s:rtp(g:plugs[name]).'/**' - for dir in ['ftdetect', 'ftplugin'] + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] if len(finddir(dir, path)) if exists('#BufRead') doautocmd BufRead @@ -546,7 +712,7 @@ function! plug#(repo, ...) try let repo = s:trim(a:repo) let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec - let name = get(opts, 'as', fnamemodify(repo, ':t:s?\.git$??')) + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) let spec = extend(s:infer_properties(name, repo), opts) if !has_key(g:plugs, name) call add(g:plugs_order, name) @@ -554,19 +720,41 @@ function! plug#(repo, ...) let g:plugs[name] = spec let s:loaded[name] = get(s:loaded, name, 0) catch - return s:err(v:exception) + return s:err(repo . ' ' . v:exception) endtry endfunction function! s:parse_options(arg) let opts = copy(s:base_spec) let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif let opts.tag = a:arg elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif call extend(opts, a:arg) if has_key(opts, 'dir') - let opts.dir = s:dirpath(expand(opts.dir)) + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) endif else throw 'Invalid argument type (expected: string or dictionary)' @@ -577,7 +765,7 @@ endfunction function! s:infer_properties(name, repo) let repo = a:repo if s:is_local_plug(repo) - return { 'dir': s:dirpath(expand(repo)) } + return { 'dir': s:dirpath(s:plug_expand(repo)) } else if repo =~ ':' let uri = repo @@ -605,7 +793,7 @@ function! plug#helptags() return s:err('plug#begin was not called') endif for spec in values(g:plugs) - let docd = join([spec.dir, 'doc'], '/') + let docd = join([s:rtp(spec), 'doc'], '/') if isdirectory(docd) silent! execute 'helptags' s:esc(docd) endif @@ -620,7 +808,7 @@ function! s:syntax() syn match plugNumber /[0-9]\+[0-9.]*/ contained syn match plugBracket /[[\]]/ contained syn match plugX /x/ contained - syn match plugDash /^-/ + syn match plugDash /^-\{1}\ / syn match plugPlus /^+/ syn match plugStar /^*/ syn match plugMessage /\(^- \)\@<=.*/ @@ -638,6 +826,7 @@ function! s:syntax() syn match plugError /^x.*/ syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ syn match plugH2 /^.*:\n-\+$/ + syn match plugH2 /^-\{2,}/ syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean hi def link plug1 Title hi def link plug2 Repeat @@ -730,7 +919,7 @@ function! s:finish_bindings() endfunction function! s:prepare(...) - if empty(getcwd()) + if empty(s:plug_getcwd()) throw 'Invalid current working directory. Cannot proceed.' endif @@ -750,7 +939,7 @@ function! s:prepare(...) call s:new_window() endif - nnoremap q :if b:plug_preview==1pcendifbd + nnoremap q :call close_pane() if a:0 == 0 call s:finish_bindings() endif @@ -763,12 +952,24 @@ function! s:prepare(...) execute 'silent! unmap ' k endfor setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif setf vim-plug if exists('g:syntax_on') call s:syntax() endif endfunction +function! s:close_pane() + if b:plug_preview == 1 + pc + let b:plug_preview = -1 + else + bd + endif +endfunction + function! s:assign_name() " Assign buffer name let prefix = '[Plugins]' @@ -782,24 +983,38 @@ function! s:assign_name() endfunction function! s:chsh(swap) - let prev = [&shell, &shellredir] - if !s:is_win && a:swap - set shell=sh shellredir=>%s\ 2>&1 + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if s:is_powershell(&shell) + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif endif return prev endfunction function! s:bang(cmd, ...) + let batchfile = '' try - let [sh, shrd] = s:chsh(a:0) + let [sh, shellcmdflag, shrd] = s:chsh(a:0) " FIXME: Escaping is incomplete. We could use shellescape with eval, " but it won't work on Windows. let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd - let g:_plug_bang = '!'.escape(cmd, '#!%') + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') execute "normal! :execute g:_plug_bang\\" finally unlet g:_plug_bang - let [&shell, &shellredir] = [sh, shrd] + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif endtry return v:shell_error ? 'Exit status: ' . v:shell_error : '' endfunction @@ -810,7 +1025,7 @@ function! s:regress_bar() endfunction function! s:is_updated(dir) - return !empty(s:system_chomp('git log --pretty=format:"%h" "HEAD...HEAD@{1}"', a:dir)) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) endfunction function! s:do(pull, force, todo) @@ -847,6 +1062,7 @@ function! s:do(pull, force, todo) endif elseif type == s:TYPE.funcref try + call s:load_plugin(spec) let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') call spec.do({ 'name': name, 'status': status, 'force': a:force }) catch @@ -873,10 +1089,11 @@ endfunction function! s:checkout(spec) let sha = a:spec.commit - let output = s:system('git rev-parse HEAD', a:spec.dir) - if !v:shell_error && !s:hash_match(sha, s:lines(output)[0]) + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' let output = s:system( - \ 'git fetch --depth 999999 && git checkout '.s:esc(sha).' --', a:spec.dir) + \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) endif return output endfunction @@ -898,7 +1115,7 @@ function! s:finish(pull) call add(msgs, "Press 'R' to retry.") endif if a:pull && len(s:update.new) < len(filter(getline(5, '$'), - \ "v:val =~ '^- ' && stridx(v:val, 'Already up-to-date') < 0")) + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) call add(msgs, "Press 'D' to see the updated changes.") endif echo join(msgs, ' ') @@ -991,13 +1208,20 @@ function! s:update_impl(pull, force, args) abort normal! 2G silent! redraw - let s:clone_opt = get(g:, 'plug_shallow', 1) ? - \ '--depth 1' . (s:git_version_requirement(1, 7, 10) ? ' --no-single-branch' : '') : '' + let s:clone_opt = [] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif - if has('win32unix') - let s:clone_opt .= ' -c core.eol=lf -c core.autocrlf=input' + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) endif + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + " Python version requirement (>= 2.7) if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 redir => pyv @@ -1071,7 +1295,7 @@ function! s:update_finish() elseif has_key(spec, 'tag') let tag = spec.tag if tag =~ '\*' - let tags = s:lines(s:system('git tag --list '.s:shellesc(tag).' --sort -version:refname 2>&1', spec.dir)) + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) if !v:shell_error && !empty(tags) let tag = tags[0] call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) @@ -1079,17 +1303,17 @@ function! s:update_finish() endif endif call s:log4(name, 'Checking out '.tag) - let out = s:system('git checkout -q '.s:esc(tag).' -- 2>&1', spec.dir) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) else - let branch = s:esc(get(spec, 'branch', 'master')) - call s:log4(name, 'Merging origin/'.branch) - let out = s:system('git checkout -q '.branch.' -- 2>&1' - \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only origin/'.branch.' 2>&1')), spec.dir) + let branch = s:git_origin_branch(spec) + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) endif if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) call s:log4(name, 'Updating submodules. This may take a while.') - let out .= s:bang('git submodule update --init --recursive 2>&1', spec.dir) + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) endif let msg = s:format_message(v:shell_error ? 'x': '-', name, out) if v:shell_error @@ -1128,7 +1352,7 @@ function! s:job_abort() silent! call job_stop(j.jobid) endif if j.new - call s:system('rm -rf ' . s:shellesc(g:plugs[name].dir)) + call s:rm_rf(g:plugs[name].dir) endif endfor let s:jobs = {} @@ -1174,7 +1398,7 @@ function! s:job_cb(fn, job, ch, data) endfunction function! s:nvim_cb(job_id, data, event) dict abort - return a:event == 'stdout' ? + return (a:event == 'stdout' || a:event == 'stderr') ? \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : \ s:job_cb('s:job_exit_cb', self, 0, a:data) endfunction @@ -1183,15 +1407,18 @@ function! s:spawn(name, cmd, opts) let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], \ 'new': get(a:opts, 'new', 0) } let s:jobs[a:name] = job - let argv = add(s:is_win ? ['cmd', '/c'] : ['sh', '-c'], - \ has_key(a:opts, 'dir') ? s:with_cd(a:cmd, a:opts.dir) : a:cmd) if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd call extend(job, { \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), \ 'on_exit': function('s:nvim_cb'), \ }) - let jid = jobstart(argv, job) + let jid = s:plug_call('jobstart', argv, job) if jid > 0 let job.jobid = jid else @@ -1201,9 +1428,16 @@ function! s:spawn(name, cmd, opts) \ 'Invalid arguments (or job table is full)'] endif elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] let jid = job_start(s:is_win ? join(argv, ' ') : argv, { \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', \ 'out_mode': 'raw' \}) if job_status(jid) == 'run' @@ -1214,8 +1448,7 @@ function! s:spawn(name, cmd, opts) let job.lines = ['Failed to start job'] endif else - let params = has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd] - let job.lines = s:lines(call('s:system', params)) + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) let job.error = v:shell_error != 0 let job.running = 0 endif @@ -1249,9 +1482,10 @@ function! s:bar() endfunction function! s:logpos(name) - for i in range(4, line('$')) + let max = line('$') + for i in range(4, max > 4 ? max : 4) if getline(i) =~# '^[-+x*] '.a:name.':' - for j in range(i + 1, line('$')) + for j in range(i + 1, max > 5 ? max : 5) if getline(j) !~ '^ ' return [i, j - 1] endif @@ -1301,7 +1535,7 @@ while 1 " Without TCO, Vim stack is bound to explode let name = keys(s:update.todo)[0] let spec = remove(s:update.todo, name) - let new = !isdirectory(spec.dir) + let new = empty(globpath(spec.dir, '.git', 1)) call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') redraw @@ -1311,8 +1545,14 @@ while 1 " Without TCO, Vim stack is bound to explode let [error, _] = s:git_validate(spec, 0) if empty(error) if pull - let fetch_opt = (has_tag && !empty(globpath(spec.dir, '.git/shallow'))) ? '--depth 99999999' : '' - call s:spawn(name, printf('git fetch %s %s 2>&1', fetch_opt, prog), { 'dir': spec.dir }) + let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) else let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } endif @@ -1320,12 +1560,14 @@ while 1 " Without TCO, Vim stack is bound to explode let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } endif else - call s:spawn(name, - \ printf('git clone %s %s %s %s 2>&1', - \ has_tag ? '' : s:clone_opt, - \ prog, - \ s:shellesc(spec.uri), - \ s:shellesc(s:trim(spec.dir))), { 'new': 1 }) + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) endif if !s:jobs[name].running @@ -1362,7 +1604,7 @@ G_NVIM = vim.eval("has('nvim')") == '1' G_PULL = vim.eval('s:update.pull') == '1' G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) -G_CLONE_OPT = vim.eval('s:clone_opt') +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) G_PROGRESS = vim.eval('s:progress_opt(1)') G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) G_STOP = thr.Event() @@ -1899,7 +2141,7 @@ function! s:update_ruby() end } if VIM::evaluate('s:mac_gui') == 1 - clone_opt = VIM::evaluate('s:clone_opt') + clone_opt = VIM::evaluate('s:clone_opt').join(' ') progress = VIM::evaluate('s:progress_opt(1)') nthr.times do mtx.synchronize do @@ -1952,8 +2194,45 @@ function! s:update_ruby() EOF endfunction -function! s:shellesc(arg) - return '"'.escape(a:arg, '"').'"' +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\(\.exe\)\?$' + return s:shellesc_cmd(a:arg, script) + elseif s:is_powershell(shell) + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) endfunction function! s:glob_dir(path) @@ -1985,17 +2264,41 @@ function! s:format_message(bullet, name, message) endif endfunction -function! s:with_cd(cmd, dir) - return printf('cd%s %s && %s', s:is_win ? ' /d' : '', s:shellesc(a:dir), a:cmd) +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) endfunction function! s:system(cmd, ...) + let batchfile = '' try - let [sh, shrd] = s:chsh(1) - let cmd = a:0 > 0 ? s:with_cd(a:cmd, a:1) : a:cmd - return system(s:is_win ? '('.cmd.')' : cmd) + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) finally - let [&shell, &shellredir] = [sh, shrd] + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif endtry endfunction @@ -2007,18 +2310,17 @@ endfunction function! s:git_validate(spec, check_branch) let err = '' if isdirectory(a:spec.dir) - let result = s:lines(s:system('git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url', a:spec.dir)) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] let remote = result[-1] - if v:shell_error + if empty(remote) let err = join([remote, 'PlugClean required.'], "\n") elseif !s:compare_git_uri(remote, a:spec.uri) let err = join(['Invalid URI: '.remote, \ 'Expected: '.a:spec.uri, \ 'PlugClean required.'], "\n") elseif a:check_branch && has_key(a:spec, 'commit') - let result = s:lines(s:system('git rev-parse HEAD 2>&1', a:spec.dir)) - let sha = result[-1] - if v:shell_error + let sha = s:git_revision(a:spec.dir) + if empty(sha) let err = join(add(result, 'PlugClean required.'), "\n") elseif !s:hash_match(sha, a:spec.commit) let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', @@ -2026,8 +2328,9 @@ function! s:git_validate(spec, check_branch) \ 'PlugUpdate required.'], "\n") endif elseif a:check_branch - let branch = result[0] + let current_branch = result[0] " Check tag + let origin_branch = s:git_origin_branch(a:spec) if has_key(a:spec, 'tag') let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) if a:spec.tag !=# tag && a:spec.tag !~ '\*' @@ -2035,25 +2338,26 @@ function! s:git_validate(spec, check_branch) \ (empty(tag) ? 'N/A' : tag), a:spec.tag) endif " Check branch - elseif a:spec.branch !=# branch + elseif origin_branch !=# current_branch let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', - \ branch, a:spec.branch) + \ current_branch, origin_branch) endif if empty(err) - let [ahead, behind] = split(s:lastline(s:system(printf( - \ 'git rev-list --count --left-right HEAD...origin/%s', - \ a:spec.branch), a:spec.dir)), '\t') + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') if !v:shell_error && ahead if behind " Only mention PlugClean if diverged, otherwise it's likely to be " pushable (and probably not that messed up). let err = printf( \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" - \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', a:spec.branch, ahead, behind) + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) else let err = printf("Ahead of origin/%s by %d commit(s).\n" \ .'Cannot update until local changes are pushed.', - \ a:spec.branch, ahead) + \ origin_branch, ahead) endif endif endif @@ -2066,7 +2370,9 @@ endfunction function! s:rm_rf(dir) if isdirectory(a:dir) - call s:system((s:is_win ? 'rmdir /S /Q ' : 'rm -rf ') . s:shellesc(a:dir)) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) endif endfunction @@ -2098,7 +2404,7 @@ function! s:clean(force) let allowed = {} for dir in dirs - let allowed[s:dirpath(fnamemodify(dir, ':h:h'))] = 1 + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 let allowed[dir] = 1 for child in s:glob_dir(dir) let allowed[child] = 1 @@ -2148,6 +2454,7 @@ endfunction function! s:delete(range, force) let [l1, l2] = a:range let force = a:force + let err_count = 0 while l1 <= l2 let line = getline(l1) if line =~ '^- ' && isdirectory(line[2:]) @@ -2156,11 +2463,22 @@ function! s:delete(range, force) let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) let force = force || answer > 1 if answer - call s:rm_rf(line[2:]) + let err = s:rm_rf(line[2:]) setlocal modifiable - call setline(l1, '~'.line[1:]) - let s:clean_count += 1 - call setline(4, printf('Removed %d directories.', s:clean_count)) + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) setlocal nomodifiable endif endif @@ -2171,11 +2489,11 @@ endfunction function! s:upgrade() echo 'Downloading the latest version of vim-plug' redraw - let tmp = tempname() + let tmp = s:plug_tempname() let new = tmp . '/plug.vim' try - let out = s:system(printf('git clone --depth 1 %s %s', s:plug_src, tmp)) + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) if v:shell_error return s:err('Error upgrading vim-plug: '. out) endif @@ -2210,15 +2528,16 @@ function! s:status() let unloaded = 0 let [cnt, total] = [0, len(g:plugs)] for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) if has_key(spec, 'uri') - if isdirectory(spec.dir) + if is_dir let [err, _] = s:git_validate(spec, 1) let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] else let [valid, msg] = [0, 'Not found. Try PlugInstall.'] endif else - if isdirectory(spec.dir) + if is_dir let [valid, msg] = [1, 'OK'] else let [valid, msg] = [0, 'Not found.'] @@ -2227,7 +2546,7 @@ function! s:status() let cnt += 1 let ecnt += !valid " `s:loaded` entry can be missing if PlugUpgraded - if valid && get(s:loaded, name, -1) == 0 + if is_dir && get(s:loaded, name, -1) == 0 let unloaded = 1 let msg .= ' (not loaded)' endif @@ -2315,11 +2634,19 @@ function! s:preview_commit() wincmd P endif setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable + let batchfile = '' try - let [sh, shrd] = s:chsh(1) - execute 'silent %!cd' s:shellesc(g:plugs[name].dir) '&& git show --no-color --pretty=medium' sha + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd finally - let [&shell, &shellredir] = [sh, shrd] + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif endtry setlocal nomodifiable nnoremap q :q @@ -2360,12 +2687,23 @@ function! s:diff() endif call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') for [k, v] in plugs - let range = origin ? '..origin/'.v.branch : 'HEAD@{1}..' - let diff = s:system_chomp('git log --graph --color=never --pretty=format:"%x01%h%x01%d%x01%s%x01%cr" '.s:shellesc(range), v.dir) - if !empty(diff) - let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' - call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) - let cnts[origin] += 1 + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif endif let bar .= '=' call s:progress_bar(2, bar, len(total)) @@ -2380,8 +2718,13 @@ function! s:diff() \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) if cnts[0] || cnts[1] - nnoremap :silent! call preview_commit() - nnoremap o :silent! call preview_commit() + nnoremap (plug-preview) :silent! call preview_commit() + if empty(maparg("\", 'n')) + nmap (plug-preview) + endif + if empty(maparg('o', 'n')) + nmap o (plug-preview) + endif endif if cnts[0] nnoremap X :call revert() @@ -2402,7 +2745,7 @@ function! s:revert() return endif - call s:system('git reset --hard HEAD@{1} && git checkout '.s:esc(g:plugs[name].branch).' --', g:plugs[name].dir) + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) setlocal modifiable normal! "_dap setlocal nomodifiable @@ -2422,7 +2765,7 @@ function! s:snapshot(force, ...) abort let names = sort(keys(filter(copy(g:plugs), \'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)'))) for name in reverse(names) - let sha = s:system_chomp('git rev-parse --short HEAD', g:plugs[name].dir) + let sha = s:git_revision(g:plugs[name].dir) if !empty(sha) call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) redraw @@ -2430,7 +2773,7 @@ function! s:snapshot(force, ...) abort endfor if a:0 > 0 - let fn = expand(a:1) + let fn = s:plug_expand(a:1) if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) return endif diff --git a/home/.config/nvim/init.vim b/home/.config/nvim/init.vim index a0a8b25..dcf6828 100644 --- a/home/.config/nvim/init.vim +++ b/home/.config/nvim/init.vim @@ -53,6 +53,7 @@ let g:gruvbox_contrast_dark = 'dark' let g:netrw_browse_split = 2 au BufEnter *.js.ejs set ft=javascript.ejs +au BufEnter *.cir set ft=spice au BufEnter *.dart set ft=dart au BufEnter *.sshconf set ft=sshconfig @@ -83,17 +84,20 @@ endfunction autocmd FileType javascript set includeexpr=LoadMainNodeModule(v:fname) autocmd FileType typescript set includeexpr=LoadMainNodeModule(v:fname) autocmd FileType vue set includeexpr=LoadMainNodeModule(v:fname) +" autocmd FileType vue set ft=vue.html " }}} +" Load tempate +autocmd BufNewFile *.vue if &modifiable | execute('0r ~/.config/nvim/templates/template.vue') | endif +autocmd BufNewFile *.test.js if &modifiable | execute('0r ~/.config/nvim/templates/template.test.js')| endif +autocmd BufNewFile *.js if &modifiable | execute('Header') | endif + " for java {{{ autocmd BufRead *.java set include=^#\s*import autocmd BufRead *.java set includeexpr=substitute(v:fname,'\\.','/','g') autocmd BufRead *.java set suffixesadd=.java,.xml autocmd BufRead *.ect set suffixesadd=.ect ft=html.ect -" For vue js -" autocmd BufRead,BufNewFile *.vue setlocal filetype=html.vue - " For Nunjucks templates autocmd BufRead *.njk set ft=jinja @@ -115,12 +119,18 @@ let g:syntastic_go_checkers = ['gofmt'] " for JavaScript syntax checking {{{ let g:syntastic_always_populate_loc_list = 1 let g:syntastic_javascript_checkers = ['eslint'] +let g:syntastic_javascript_checkers = ['eslint'] " }}} " set lazyredraw -let g:sparkupNextMapping = '' +" let g:sparkupNextMapping = '' +let g:user_emmet_mode='inv' "enable all functions, which is equal to +let g:user_emmet_install_global = 0 +autocmd FileType html,css,vue,jsx,php EmmetInstall +imap (emmet-expand-abbr) +" let g:user_emmet_leader_key='' @@ -150,13 +160,16 @@ call plug#begin( ) Plug 'jamessan/vim-gnupg' Plug 'SirVer/ultisnips' Plug 'honza/vim-snippets' -Plug 'rstacruz/sparkup' " HTML zen-coding helper +" Plug 'rstacruz/sparkup' " HTML zen-coding helper +Plug 'mattn/emmet-vim' Plug 'tomtom/tcomment_vim' " Code commenting uncommenting Plug 'tpope/vim-surround' " quickly Insert/remove/change quote/brackes any vim selection. Plug 'harish2704/harish2704-vim' " My utilities to move widows around tabs Plug 'junegunn/fzf' Plug 'junegunn/fzf.vim' " Ctrl-p Quick file search Plug 'wsdjeg/vim-fetch' +Plug 'mbbill/undotree' " Visualize undo history +" Plug 'bogado/file-line' " Open file:linenumber " } " " Extra utilities { @@ -168,17 +181,22 @@ Plug 'godlygeek/tabular' " Tabularize Text Plug 'tpope/vim-fugitive' " For Git repo management. Plug 'spf13/vim-autoclose' " Autoclose brackets/quotes etc Plug 'chrisbra/NrrwRgn' " Edit a portion file as different buffer -Plug 'prettier/vim-prettier', { 'do': 'yarn install', -\ 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'yaml', 'html'] } +Plug 'prettier/vim-prettier', { 'do': 'yarn install', 'for': ['javascript', 'typescript', 'css', 'less', 'scss', 'json', 'graphql', 'markdown', 'vue', 'yaml', 'html'] } +" Plug 'easymotion/vim-easymotion' " } " " Langualge plugins{ -Plug 'iamcco/markdown-preview.nvim', { 'for': 'markdown', 'do': 'cd app & yarn install' } +if has('nvim') + Plug 'iamcco/markdown-preview.nvim', { 'for': 'markdown', 'do': 'cd app & yarn install' } + Plug 'mhartington/nvim-typescript' , { 'for': [ 'javascript.ts'] } +else + Plug 'roxma/vim-hug-neovim-rpc' + Plug 'roxma/nvim-yarp' +endif Plug 'rust-lang/rust.vim', { 'for': 'rust'} Plug 'pangloss/vim-javascript', " { 'for': 'javascript'} Plug 'mxw/vim-jsx' , { 'for': [ 'jsx'] } Plug 'leafOfTree/vim-vue-plugin' , { 'for': ['vue']} -Plug 'mhartington/nvim-typescript' , { 'for': [ 'javascript.ts'] } Plug 'AndrewRadev/vim-eco', { 'for': [ 'ect', 'eco' ] } Plug 'Glench/Vim-Jinja2-Syntax', { 'for': [ 'html', 'jinja', 'njk' ] } Plug 'kchmck/vim-coffee-script', { 'for': 'coffee' } @@ -192,6 +210,8 @@ Plug 'editorconfig/editorconfig-vim' Plug 'dart-lang/dart-vim-plugin', { 'for': 'dart' } Plug 'thosakwe/vim-flutter', { 'for': 'dart' } Plug 'fatih/vim-go', { 'for': 'go', 'do': ':GoUpdateBinaries' } +Plug 'pantharshit00/vim-prisma', { 'for': 'prisma' } + " } @@ -289,7 +309,11 @@ imap " '\\es' or 'es' Open vimrc in a new tab -execute( 'nmap es :tabedit '. g:nvim_conf_root .'init.vim ' ) +if has('nvim') + execute( 'nmap es :tabedit '. g:nvim_conf_root .'init.vim ' ) +else + execute( 'nmap es :tabedit '. $MYVIMRC .' ' ) +endif " '\\en' 'en' Open current file's snippets file in a new tab nmap en :execute 'OpenSnippets' diff --git a/home/.config/plasma-org.kde.plasma.desktop-appletsrc b/home/.config/plasma-org.kde.plasma.desktop-appletsrc index 8dce164..d1002ba 100644 --- a/home/.config/plasma-org.kde.plasma.desktop-appletsrc +++ b/home/.config/plasma-org.kde.plasma.desktop-appletsrc @@ -1,5 +1,5 @@ [ActionPlugins][0] -MidButton;NoModifier=org.kde.paste +MiddleButton;NoModifier=org.kde.paste RightButton;NoModifier=org.kde.contextmenu [ActionPlugins][0][RightButton;NoModifier] @@ -24,6 +24,10 @@ run associated application=true [ActionPlugins][1] RightButton;NoModifier=org.kde.contextmenu +[AppletGlobals][org.kde.plasma.comic] +lastUpdate=2021,9,16,19,12,29.478 +updateInterval=3 + [Containments][2] activityId= formfactor=2 @@ -173,12 +177,15 @@ PreloadWeight=0 DialogHeight=540 DialogWidth=720 +[Containments][23][Applets][26][Configuration][General] +launchers= + [Containments][23][Applets][27] immutability=1 plugin=org.kde.plasma.systemtray [Containments][23][Applets][27][Configuration] -PreloadWeight=100 +PreloadWeight=81 SystrayContainmentId=46 [Containments][23][Applets][29] @@ -186,16 +193,18 @@ immutability=1 plugin=org.kde.plasma.digitalclock [Containments][23][Applets][29][Configuration] -PreloadWeight=100 +PreloadWeight=9 [Containments][23][Applets][29][Configuration][Appearance] +boldText=true +selectedTimeZones=America/New_York,Local showDate=true showSeconds=true use24hFormat=0 [Containments][23][Applets][29][Configuration][ConfigDialog] -DialogHeight=480 -DialogWidth=640 +DialogHeight=744 +DialogWidth=960 [Containments][23][Applets][30] immutability=1 @@ -204,24 +213,6 @@ plugin=org.kde.plasma.showdesktop [Containments][23][Applets][30][Configuration] PreloadWeight=0 -[Containments][23][Applets][39] -immutability=1 -plugin=org.kde.plasma.icon - -[Containments][23][Applets][39][Configuration] -PreloadWeight=0 -localPath=/home/hari/.local/share/plasma_icons/geany.desktop -url=file:///usr/share/applications/geany.desktop - -[Containments][23][Applets][40] -immutability=1 -plugin=org.kde.plasma.icon - -[Containments][23][Applets][40][Configuration] -PreloadWeight=0 -localPath=/home/hari/.local/share/plasma_icons/chromium-browser.desktop -url=file:///usr/share/applications/chromium-browser.desktop - [Containments][23][Applets][41] immutability=1 plugin=org.kde.plasma.icon @@ -296,22 +287,50 @@ PreloadWeight=0 localPath=/home/hari/.local/share/plasma_icons/kcm_kdeconnect.desktop url=file:///usr/share/kservices5/kcm_kdeconnect.desktop -[Containments][23][Applets][75] +[Containments][23][Applets][78] +immutability=1 +plugin=org.kde.plasma.icon + +[Containments][23][Applets][78][Configuration] +PreloadWeight=0 +localPath=/home/hari/.local/share/plasma_icons/barrier.desktop +url=file:///usr/share/applications/barrier.desktop + +[Containments][23][Applets][80] immutability=1 plugin=org.kde.plasma.icon -[Containments][23][Applets][75][Configuration] -PreloadWeight=18 +[Containments][23][Applets][80][Configuration] +PreloadWeight=0 +localPath=/home/hari/.local/share/plasma_icons/geany.desktop +url=file:///usr/share/applications/geany.desktop + +[Containments][23][Applets][87] +immutability=1 +plugin=org.kde.plasma.icon + +[Containments][23][Applets][87][Configuration] +PreloadWeight=0 localPath=/home/hari/.local/share/plasma_icons/firefox.desktop url=file:///usr/share/applications/firefox.desktop -[Containments][23][Applets][78] +[Containments][23][Applets][88] immutability=1 plugin=org.kde.plasma.icon -[Containments][23][Applets][78][Configuration] -localPath=/home/hari/.local/share/plasma_icons/barrier.desktop -url=file:///usr/share/applications/barrier.desktop +[Containments][23][Applets][88][Configuration] +PreloadWeight=0 +localPath=/home/hari/.local/share/plasma_icons/simple-scan.desktop +url=file:///usr/share/applications/simple-scan.desktop + +[Containments][23][Applets][89] +immutability=1 +plugin=org.kde.plasma.icon + +[Containments][23][Applets][89][Configuration] +PreloadWeight=0 +localPath=/home/hari/.local/share/plasma_icons/brave-browser.desktop +url=file:///usr/share/applications/brave-browser.desktop [Containments][23][ConfigDialog] DialogHeight=90 @@ -321,7 +340,7 @@ DialogWidth=1920 PreloadWeight=0 [Containments][23][General] -AppletOrder=71;43;40;75;39;74;59;41;42;62;78;26;25;27;29;30 +AppletOrder=71;43;89;87;80;74;59;88;41;42;62;78;26;25;27;29;30 [Containments][46] activityId= @@ -337,7 +356,7 @@ immutability=1 plugin=org.kde.plasma.volume [Containments][46][Applets][47][Configuration] -PreloadWeight=100 +PreloadWeight=0 [Containments][46][Applets][47][Configuration][ConfigDialog] DialogHeight=660 @@ -351,7 +370,7 @@ immutability=1 plugin=org.kde.plasma.devicenotifier [Containments][46][Applets][49][Configuration] -PreloadWeight=100 +PreloadWeight=59 [Containments][46][Applets][50] immutability=1 @@ -376,14 +395,14 @@ immutability=1 plugin=org.kde.plasma.battery [Containments][46][Applets][52][Configuration] -PreloadWeight=100 +PreloadWeight=0 [Containments][46][Applets][53] immutability=1 plugin=org.kde.plasma.networkmanagement [Containments][46][Applets][53][Configuration] -PreloadWeight=100 +PreloadWeight=84 [Containments][46][Applets][53][Configuration][ConfigDialog] DialogHeight=540 @@ -394,7 +413,7 @@ immutability=1 plugin=org.kde.plasma.bluetooth [Containments][46][Applets][54][Configuration] -PreloadWeight=7 +PreloadWeight=0 [Containments][46][Applets][55] immutability=1 @@ -411,7 +430,7 @@ immutability=1 plugin=org.kde.kdeconnect [Containments][46][Applets][58][Configuration] -PreloadWeight=5 +PreloadWeight=0 [Containments][46][Applets][61] immutability=1 @@ -428,25 +447,54 @@ immutability=1 plugin=org.kde.kscreen [Containments][46][Applets][76][Configuration] -PreloadWeight=100 +PreloadWeight=0 + +[Containments][46][Applets][76][Configuration][ConfigDialog] +DialogHeight=720 +DialogWidth=960 + +[Containments][46][Applets][76][Shortcuts] +global= [Containments][46][Applets][77][Configuration] PreloadWeight=42 +[Containments][46][Applets][80][Configuration] +PreloadWeight=42 + +[Containments][46][Applets][81] +immutability=1 +plugin=org.kde.plasma.keyboardlayout + +[Containments][46][Applets][81][Configuration] +PreloadWeight=0 + +[Containments][46][Applets][82] +immutability=1 +plugin=org.kde.plasma.manage-inputmethod + +[Containments][46][Applets][82][Configuration] +PreloadWeight=0 + +[Containments][46][Applets][87][Configuration] +PreloadWeight=42 + [Containments][46][ConfigDialog] -DialogHeight=540 -DialogWidth=720 +DialogHeight=744 +DialogWidth=1093 [Containments][46][Configuration] PreloadWeight=0 [Containments][46][General] -extraItems=org.kde.plasma.volume,org.kde.plasma.keyboardindicator,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.networkmanagement,org.kde.plasma.battery,org.kde.plasma.bluetooth,org.kde.plasma.notifications,org.kde.kdeconnect,org.kde.plasma.nightcolorcontrol,org.kde.kscreen +extraItems=org.kde.plasma.volume,org.kde.plasma.keyboardindicator,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.networkmanagement,org.kde.plasma.battery,org.kde.plasma.bluetooth,org.kde.plasma.notifications,org.kde.kdeconnect,org.kde.plasma.nightcolorcontrol,org.kde.kscreen,org.kde.plasma.keyboardlayout,org.kde.plasma.manage-inputmethod iconSize=1 -knownItems=org.kde.plasma.volume,org.kde.plasma.keyboardindicator,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.clipboard,org.kde.plasma.networkmanagement,org.kde.plasma.battery,org.kde.plasma.bluetooth,org.kde.plasma.notifications,org.kde.kdeconnect,org.kde.plasma.nightcolorcontrol +knownItems=org.kde.plasma.volume,org.kde.plasma.keyboardindicator,org.kde.plasma.mediacontroller,org.kde.plasma.devicenotifier,org.kde.plasma.clipboard,org.kde.plasma.networkmanagement,org.kde.plasma.battery,org.kde.plasma.bluetooth,org.kde.plasma.notifications,org.kde.kdeconnect,org.kde.plasma.nightcolorcontrol,org.kde.plasma.keyboardlayout,org.kde.plasma.manage-inputmethod [Containments][63] -ItemGeometriesHorizontal= +ItemGeometries-1600x900=Applet-86:1280,16,320,304,0; +ItemGeometries-1920x1080=Applet-86:1280,16,320,304,0; +ItemGeometriesHorizontal=Applet-86:1280,16,320,304,0; activityId=1de2555c-8dce-4b05-9048-0576a7cc6b7a formfactor=0 immutability=1 @@ -455,6 +503,25 @@ location=0 plugin=org.kde.plasma.folder wallpaperplugin=org.kde.image +[Containments][63][Applets][86] +immutability=1 +plugin=org.kde.plasma.systemmonitor + +[Containments][63][Applets][86][Configuration] +PreloadWeight=0 + +[Containments][63][Applets][86][Configuration][Appearance] +chartFace=org.kde.ksysguard.piechart +title=Memory Usage + +[Containments][63][Applets][86][Configuration][SensorColors] +memory/physical/used=61,174,233 + +[Containments][63][Applets][86][Configuration][Sensors] +highPrioritySensorIds=["memory/physical/used"] +lowPrioritySensorIds=["memory/physical/total"] +totalSensors=["memory/physical/usedPercent"] + [Containments][63][ConfigDialog] DialogHeight=660 DialogWidth=880 @@ -464,15 +531,16 @@ PreloadWeight=0 [Containments][63][General] ToolBoxButtonState=topcenter -ToolBoxButtonX=717 -ToolBoxButtonY=34 -positions=1,15,desktop:/arduino-arduinoide.desktop,0,0,desktop:/LTspice XVII.desktop,0,1,desktop:/spacefm.desktop,0,2 -sortMode=-1 +ToolBoxButtonX=611 +ToolBoxButtonY=32 [Containments][63][Wallpaper][org.kde.image][General] Image=file:///usr/share/wallpapers/openSUSEdefault/contents/images/1920x1080.jpg [Containments][64] +ItemGeometries-1600x900= +ItemGeometries-1920x1080= +ItemGeometriesHorizontal= activityId=1de2555c-8dce-4b05-9048-0576a7cc6b7a formfactor=0 immutability=1 @@ -488,6 +556,8 @@ PreloadWeight=0 Image=file:///usr/share/wallpapers/openSUSEdefault/contents/images/1920x1080.jpg [Containments][65] +ItemGeometries-1600x900= +ItemGeometries-1920x1080= ItemGeometriesHorizontal= activityId=1de2555c-8dce-4b05-9048-0576a7cc6b7a formfactor=0 @@ -501,9 +571,11 @@ wallpaperplugin=org.kde.image PreloadWeight=0 [Containments][65][Wallpaper][org.kde.image][General] -Image=file:///usr/share/wallpapers/Next/contents/images/1920x1080.jpg +Image=file:///usr/share/wallpapers/openSUSEdefault/contents/images/1920x1080.jpg [Containments][72] +ItemGeometries-1920x1080= +ItemGeometriesHorizontal= activityId=1de2555c-8dce-4b05-9048-0576a7cc6b7a formfactor=0 immutability=1 @@ -516,7 +588,31 @@ wallpaperplugin=org.kde.image PreloadWeight=0 [Containments][72][Wallpaper][org.kde.image][General] -Image=file:///usr/share/wallpapers/Next/contents/images/1920x1080.jpg +Image=file:///usr/share/wallpapers/openSUSEdefault/contents/images/1920x1080.jpg + +[Containments][79] +activityId=1de2555c-8dce-4b05-9048-0576a7cc6b7a +formfactor=0 +immutability=1 +lastScreen=3 +location=0 +plugin=org.kde.plasma.folder +wallpaperplugin=org.kde.image + +[Containments][79][Configuration] +PreloadWeight=0 + +[Containments][79][Wallpaper][org.kde.image][General] +Image=file:///usr/share/wallpapers/openSUSEdefault/contents/images/1920x1080.jpg + +[Containments][90][Configuration] +PreloadWeight=42 + +[Containments][91][Configuration] +PreloadWeight=42 + +[Containments][92][Configuration] +PreloadWeight=42 [Containments63Appletsts][68][Configuration][General] noteId=833e4740-3210-484e-8f6a-a547231739 @@ -526,4 +622,4 @@ immutability=1 [ScreenMapping] itemsOnDisabledScreens= -screenMapping=desktop:/spacefm.desktop,0,desktop:/LTspice XVII.desktop,0,desktop:/arduino-arduinoide.desktop,0 +screenMapping=desktop:/arduino-arduinoide.desktop,0,desktop:/PDF,0,desktop:/chrome-kkealmeijinhmkcnkmcpgpcjbgbffnjn-Default.desktop,0,desktop:/spacefm.desktop,0,desktop:/brave-efjpoieainaodhnlgcofglmehiojbpeb-Profile_1.desktop,0,desktop:/LTspice XVII.desktop,0,desktop:/chrome-bacfkhdndchjgmnjeggllicejaegbing-Default.desktop,0 diff --git a/home/.local/Apps/daily-utils/bin/chromium b/home/.local/Apps/daily-utils/bin/chromium new file mode 100755 index 0000000..4180dd6 --- /dev/null +++ b/home/.local/Apps/daily-utils/bin/chromium @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +/usr/bin/chromium --password-store=kwallet5 "$@" diff --git a/home/.local/Apps/daily-utils/bin/hari-tools.sh b/home/.local/Apps/daily-utils/bin/hari-tools.sh index a0926ad..70a6b38 100755 --- a/home/.local/Apps/daily-utils/bin/hari-tools.sh +++ b/home/.local/Apps/daily-utils/bin/hari-tools.sh @@ -138,7 +138,7 @@ bulk_replace(){ set -u old=$1 new=$2 - ag -l "$old" | xargs -l sed -i "s/${old}/${new}/g" + ag -l "$old" | xargs -l sed -Ei "s#${old}#${new}#g" # ag -l "$old" } @@ -182,12 +182,49 @@ kwinCompositorReload(){ qdbus-qt5 org.kde.KWin /Compositor resume } +# format cookies copied from chrome cookie table +# Usage cat file | formatChromeCookie domain.com +formatChromeCookie(){ + echo -e "# Netscape HTTP Cookie File\n\n" + cat /dev/stdin | cut -f 1,2 | xargs -l echo -e ".$1 TRUE / FALSE 0 " | sed 's/ /\t/g' +} + # List available vaccine centers cowin_list(){ curl -s -X GET \ "https://cdn-api.co-vin.in/api/v2/appointment/sessions/public/calendarByDistrict?district_id=303&date=$(date +'%d-%m-%Y' --date '1 day')" \ -H "accept: application/json" \ -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36' | jq + +chromewayland(){ + chromium --enable-features=UseOzonePlatform --ozone-platform=wayland +} + +# pidEnv . Print environment variables of a PID. +pidEnv(){ + cat /proc/$(pgrep kwin)/environ | tr '\0' '\n' | awk '{ print "export "$0}' +} + +# Copy files from local to remote +rsyncfast(){ + rsync -zaP --delete $@ +} + +# Render a subtitle into a video +#