Compare commits

...

5 Commits

11 changed files with 285 additions and 296 deletions

1
.gitignore vendored
View File

@ -3,6 +3,7 @@ vim/bundle/*
vim/plugged/*
vim/undo
vim/undo/*
vim/autoload/plug.vim.old
config/openbox/lxde-rc.xml
*.pyc
!bin

19
aliases
View File

@ -495,8 +495,9 @@ actually_dl_twitch_chat() {
}
dl_twitch_chat() {
local url="$1"
shift 1
local make_folder="$1"
local url="$2"
shift 2
local opts="$@"
if [[ $url == "" ]]; then
@ -504,14 +505,18 @@ dl_twitch_chat() {
return
fi
make_vid_dir_and_cd_into $url "" $opts
if [[ $? -ne 0 ]]; then
return
if [[ $make_folder == "1" ]]; then
make_vid_dir_and_cd_into $url "" $opts
if [[ $? -ne 0 ]]; then
return
fi
fi
actually_dl_twitch_chat $url "$(yt-dlp.exe --get-filename -o "%(upload_date>%Y-%m-%d)s-%(title)s-tw-%(id)s" $opts $url)"
cd ..
if [[ $make_folder == "1" ]]; then
cd ..
fi
}
# Download Twitch videos, both VODs and live streams. Pass a Twitch account URL to download a live stream.
@ -602,7 +607,7 @@ dl_twitch_vid() {
if [[ $compress -eq 1 ]]; then
local temp_name="temp_${RANDOM}"
# 1 arg = use GPU
compress-video 1 "$filename" "$temp_name"
compress-video 0 "$filename" "$temp_name"
extension="${filename##*.}"
mv "$filename" "orig_$filename"
mv $temp_name.$extension "$filename"

View File

@ -33,9 +33,9 @@ if [[ $use_gpu == "" || $2 == "" || $output_name == "" ]]; then
fi
# Found the following to work best with vids containing text (e.g. programming vid): 25 for CPU encoding and 27 for GPU.
use_crf=25
use_crf=21
if [[ $use_gpu -eq 1 ]]; then
use_crf=27
use_crf=25
fi
compress-video-with-crf $use_gpu $use_crf "$filename" "$output_name"

View File

@ -54,7 +54,7 @@ function encode() {
# File will be slightly larger than CPU encoding, but it's much faster to transcode and doesn't max out the CPU cores.
ffmpeg -y -stats -loglevel level+error $timing_args -vsync 0 -hwaccel cuda -hwaccel_output_format cuda -i "$filename.$extension" -c:a copy -c:v h264_nvenc -profile:v high -rc:v vbr_hq -cq:v $crf -b:v 5M -maxrate 5M -max_muxing_queue_size 9999 "$output"
else
ffmpeg $timing_args -i "$filename.$extension" -c:v libx264 -crf $crf -preset veryfast -profile:v baseline -level 3.0 -strict -2 "$output"
ffmpeg -y -stats -loglevel level+error $timing_args -i "$filename.$extension" -c:v libx264 -crf $crf -preset veryfast -profile:v high -level 3.0 -strict -2 "$output"
fi
printf "\n${GREEN}${BOLD}Finished encoding '$filename.$extension' (CRF $crf) | output name '$output'${NORMAL}\n\n"
}

View File

@ -11,6 +11,7 @@
hookspath = ~/.git_hooks
preloadindex = true
fscache = true
editor = vim
[push]
default = upstream
[pull]

7
ssh.md Normal file
View File

@ -0,0 +1,7 @@
# Creating an elliptic curve keypair (ed25519)
* Create: `ssh-keygen -a 100 -t ed25519 -f ~/.ssh/filename`
* Schema check:
* `ssh-keygen -lf ~/.ssh/filename`
* `ssh-keygen -lf ~/.ssh/filename.pub`

View File

@ -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)
@ -106,7 +106,7 @@ if s:is_win && &shellslash
else
let s:me = resolve(expand('<sfile>:p'))
endif
let s:base_spec = { 'branch': 'master', 'frozen': 0 }
let s:base_spec = { 'branch': '', 'frozen': 0 }
let s:TYPE = {
\ 'string': type(''),
\ 'list': type([]),
@ -116,6 +116,94 @@ 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
@ -154,6 +242,8 @@ function! plug#begin(...)
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 has('nvim')
let home = stdpath('data') . '/plugged'
elseif !empty(&rtp)
let home = s:path(split(&rtp, ',')[0]) . '/plugged'
else
@ -179,7 +269,7 @@ function! s:define_commands()
endif
if has('win32')
\ && &shellslash
\ && (&shell =~# 'cmd\(\.exe\)\?$' || &shell =~# 'powershell\(\.exe\)\?$')
\ && (&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')
@ -262,7 +352,7 @@ function! plug#end()
endif
let lod = { 'ft': {}, 'map': {}, 'cmd': {} }
if exists('g:did_load_filetypes')
if get(g:, 'did_load_filetypes', 0)
filetype off
endif
for name in g:plugs_order
@ -317,7 +407,7 @@ function! plug#end()
for [map, names] in items(lod.map)
for [mode, map_prefix, key_prefix] in
\ [['i', '<C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
\ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']]
execute printf(
\ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>',
\ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix)
@ -419,7 +509,7 @@ if s:is_win
let batchfile = s:plug_tempname().'.bat'
call writefile(s:wrap_cmds(a:cmd), batchfile)
let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0})
if &shell =~# 'powershell\(\.exe\)\?$'
if s:is_powershell(&shell)
let cmd = '& ' . cmd
endif
return [batchfile, cmd]
@ -646,25 +736,25 @@ function! s:parse_options(arg)
endif
let opts.tag = a:arg
elseif type == s:TYPE.dict
call extend(opts, a:arg)
for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as']
if has_key(opts, opt)
\ && (type(opts[opt]) != s:TYPE.string || empty(opts[opt]))
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(opts, opt)
\ && type(opts[opt]) != s:TYPE.list
\ && (type(opts[opt]) != s:TYPE.string || empty(opts[opt]))
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(opts, 'do')
\ && type(opts.do) != s:TYPE.funcref
\ && (type(opts.do) != s:TYPE.string || empty(opts.do))
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(s:plug_expand(opts.dir))
endif
@ -720,7 +810,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 /\(^- \)\@<=.*/
@ -738,6 +828,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
@ -850,7 +941,7 @@ function! s:prepare(...)
call s:new_window()
endif
nnoremap <silent> <buffer> q :if b:plug_preview==1<bar>pc<bar>endif<bar>bd<cr>
nnoremap <silent> <buffer> q :call <SID>close_pane()<cr>
if a:0 == 0
call s:finish_bindings()
endif
@ -872,6 +963,15 @@ function! s:prepare(...)
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]'
@ -890,7 +990,7 @@ function! s:chsh(swap)
set shell=sh
endif
if a:swap
if &shell =~# 'powershell\(\.exe\)\?$' || &shell =~# 'pwsh$'
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
@ -991,10 +1091,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 '.plug#shellescape(sha).' --', a:spec.dir)
\ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir)
endif
return output
endfunction
@ -1109,7 +1210,8 @@ function! s:update_impl(pull, force, args) abort
normal! 2G
silent! redraw
let s:clone_opt = []
" Set remote name, overriding a possible user git config's clone.defaultRemoteName
let s:clone_opt = ['--origin', 'origin']
if get(g:, 'plug_shallow', 1)
call extend(s:clone_opt, ['--depth', '1'])
if s:git_version_requirement(1, 7, 10)
@ -1206,7 +1308,7 @@ function! s:update_finish()
call s:log4(name, 'Checking out '.tag)
let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir)
else
let branch = get(spec, 'branch', 'master')
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)
@ -1446,7 +1548,7 @@ while 1 " Without TCO, Vim stack is bound to explode
let [error, _] = s:git_validate(spec, 0)
if empty(error)
if pull
let cmd = ['git', 'fetch']
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
@ -2130,7 +2232,7 @@ function! plug#shellescape(arg, ...)
let script = get(opts, 'script', 1)
if shell =~# 'cmd\(\.exe\)\?$'
return s:shellesc_cmd(a:arg, script)
elseif shell =~# 'powershell\(\.exe\)\?$' || shell =~# 'pwsh$'
elseif s:is_powershell(shell)
return s:shellesc_ps1(a:arg)
endif
return s:shellesc_sh(a:arg)
@ -2182,7 +2284,7 @@ function! s:system(cmd, ...)
return system(a:cmd)
endif
let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})'))
if &shell =~# 'powershell\(\.exe\)\?$'
if s:is_powershell(&shell)
let cmd = '& ' . cmd
endif
else
@ -2211,18 +2313,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)',
@ -2230,8 +2331,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 !~ '\*'
@ -2239,14 +2341,14 @@ 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([
\ 'git', 'rev-list', '--count', '--left-right',
\ printf('HEAD...origin/%s', a:spec.branch)
\ printf('HEAD...origin/%s', origin_branch)
\ ], a:spec.dir)), '\t')
if !v:shell_error && ahead
if behind
@ -2254,11 +2356,11 @@ function! s:git_validate(spec, check_branch)
" 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
@ -2519,26 +2621,34 @@ function! s:preview_commit()
let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}')
if empty(sha)
return
let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$')
if empty(name)
return
endif
let title = 'HEAD@{1}..'
let command = 'git diff --no-color HEAD@{1}'
else
let title = sha
let command = 'git show --no-color --pretty=medium '.sha
let name = s:find_name(line('.'))
endif
let name = s:find_name(line('.'))
if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir)
return
endif
if exists('g:plug_pwindow') && !s:is_preview_window_open()
execute g:plug_pwindow
execute 'e' sha
execute 'e' title
else
execute 'pedit' sha
execute 'pedit' title
wincmd P
endif
setlocal previewwindow filetype=git buftype=nofile nobuflisted modifiable
setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable
let batchfile = ''
try
let [sh, shellcmdflag, shrd] = s:chsh(1)
let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && git show --no-color --pretty=medium '.sha
let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command
if s:is_win
let [batchfile, cmd] = s:batchfile(cmd)
endif
@ -2588,20 +2698,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 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
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))
@ -2661,9 +2774,9 @@ function! s:snapshot(force, ...) abort
1
let anchor = line('$') - 3
let names = sort(keys(filter(copy(g:plugs),
\'has_key(v:val, "uri") && !has_key(v:val, "commit") && isdirectory(v:val.dir)')))
\'has_key(v:val, "uri") && 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 = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir)
if !empty(sha)
call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha))
redraw

2
vimrc
View File

@ -1189,7 +1189,7 @@ function! Search(case_sensitive, search_args)
"@note --pretty (i.e. colors) is not enabled in vim-ripgrep because the
"quickfix window doesn't seem to parse the ansi color codes.
let l:rg_args = "--column --line-number --no-heading --fixed-strings --no-ignore --hidden --follow --trim -g \"!tags\" " . a:search_args
let l:rg_args = "--column --line-number --no-heading --fixed-strings --no-ignore --hidden --follow --trim -g \"!tags\" -g \"!.git/\" -g \"!AppData/\" " . a:search_args
if !a:case_sensitive
let l:rg_args .= " --ignore-case"

View File

@ -1 +0,0 @@
UseSystemStylus 0

View File

@ -24,8 +24,8 @@
# Michael's custom block list
#----------------------------------------------
# Block Sublime's annoying "there's an update" dialog
127.0.0.1 www.sublimetext.com
# Block Sublime license check
127.0.0.1 license.sublimehq.com
# Block Spotify update
127.0.0.1 upgrade.spotify.com

View File

@ -1,18 +1,53 @@
# Windows Setup
* Make a system restore point after a fresh install
* Change PC name and reboot
* Disable `Enhance Pointer Precision`:
* Mouse Properties -> Pointer Options -> Motion section
* Laptop: change touchpad sensitivity to medium or high in order to prevent mouse movement when palm touches the pad while typing.
* If using a Lenovo then disable touchpad lock in the Lenovo Vantage app.
* Map caps key to left-ctrl using Sharpkeys.
* Download [O&O ShutUp10](https://www.oo-software.com/en/shutup10) and disable things.
* Install Open-Shell to restore the start menu to the sensible Windows 7 style.
* Pin "This PC" to taskbar
* In Win 10 start menu, search for "This PC", right click top result and pin to taskbar
* Configure Explorer's options
* Open file explorer, click on File menu then options or "Change folder and search options"
* General tab
* `Open File Explorer to: This PC`
* Uncheck `Show recently used files in Quick access`
* Uncheck `Show frequently used folder in Quick access`
* View tab
* Check `Show hidden files, folders, or drives`,
* Uncheck `Hide extensions for known file types`
* Disable reopening apps on startup
* Windows settings -> Account -> Sign in options -> Privacy section: turn off `Use my sign-in info to automatically finish setting up device`
* Disable window suggestion when snapping a window
* Windows settings -> System -> Multitasking -> uncheck "When I snap a window, show what I can snap next to it"
* Desktop: turn off hibernation
* Open admin cmd prompt: `powercfg.exe /hibernate off`
* Open admin cmd prompt: `powercfg.exe /hibernate off`
* Disable power throttling:
* Windows key + r, `gpedit.msc`.
* Computer Configuration > Administrative Templates > System > Power Management > Power Throttling Settings.
* Double-click the `Turn off Power Throttling` policy.
* Select Enabled.
* winkey+r -> `gpedit.msc`.
* Computer Configuration > Administrative Templates > System > Power Management > Power Throttling Settings
* Double-click the `Turn off Power Throttling` policy.
* Select Enabled.
* Disable reserved bandwidth
* Windows key + r, `gpedit.msc`.
* Disable reserved network bandwidth
* winkey+r -> `gpedit.msc`.
* Computer Configuration > Administrative Templates > Network > QoS Packet Scheduler > Limit reservable bandwidth
* Enable it and set the % to 0.
* Enable it and set the % to 0.
* Enable ultimate power plan (alternatively make a new plan and set the min/max processor speed to 100%)
* Open cmd as admin, run `powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61`
@ -20,31 +55,51 @@
* Create a power plan for software benchmarking
* This will disable turbo boost and general lock the frequency to base-ish clock. This can help
keep cpu temps stable (hot temps affect clock) and it avoids variable clock changes.
keep CPU temps stable (hot temps affect clock) and it avoids variable clock changes.
* AFAIK this only works for Intel CPUs; not sure how to do the same thing on AMD.
* In the power plan set the processor min/max speed to 99%.
* Disable UAC screen dimming
* Open User Account Control settings
* Drag the slider down one notch to remove the dimming
* Disable Windows error reporting dialog so that when stuff crashes you can get to a debugger faster.
* Open an admin cmd prompt and run the file `disable-windows-error-reporting-dialog.bat` from this directory.
* Optional: disable Windows Defender real-time protection:
* Disable the WinSAT task which is used to figure out your Windows performance score. It eats up
processor time and is generally useless.
* Open task scheduler.
* **note** If you see an error about a selected task {0} no longer existing then you'll need
to repair the task scheduler. See
https://www.thewindowsclub.com/the-selected-task-0-no-longer-exists-error-in-task-scheduler
* Go to `Local` -> `Microsoft` -> `Maintenance` and disable the WinSAT task.
* Disable the Windows Customer Experience Improvement program via group policy
https://web.archive.org/web/20200131202352/https://www.ghacks.net/2016/10/26/turn-off-the-windows-customer-experience-program/
* Increase TDR setting for GPU Driver
* TDR determines the length of time that a GPU can hang on a computation until the OS restarts
the driver. By default this is set to a few seconds so you can experience app crashes when
using GPU intensive software, like 3D modeling or texturing. To increase the duration, follow
this guide: https://web.archive.org/web/20191107173337/https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
* **Optional:** disable Windows Defender real-time protection:
* This can speed up compilation times since Defender will scan every file written to disk. I was
able to shave off ~2-5 seconds in a particular project.
* If you'd rather keep real-time protection active then you can add specific files or
folders to the Defender exclusion list in the Windows Security settings, however I did
some testing and didn't see any speedup when excluding a project folder.
* Go into the Windows security settings and disable `Tamper Protection`.
* Start menu, search for `gpedit.msc`.
* Computer Configuration > Administrative Templates > Windows Components > Microsoft Defender Antivirus -> Real-time Protection
* Double-click the `Turn off real-time protection` policy.
* Select Enabled (you may have to restart PC).
* If you want to re-enable then change the policy to `Not configured` and re-enable tamper protection.
* winkey+r -> `gpedit.msc`.
* Computer Configuration > Administrative Templates > Windows Components > Microsoft Defender Antivirus -> Real-time Protection
* Double-click the `Turn off real-time protection` policy.
* Select Enabled (you may have to restart PC).
* If you want to re-enable then change the policy to `Not configured` and re-enable tamper protection.
* Disable `Enhance Pointer Precision`:
* Mouse Properties -> Pointer Options -> Motion section
* Disable various Window features:
* Enable/disable various Window features:
* Go to Add/Remove Programs -> Turn Windows features on or off
* Enable:
* Windows hypervisor platform
* Disable:
* Internet Explorer 11
* Legacy Components - DirectPlay
@ -53,12 +108,7 @@
* Microsoft XPS Document Writer (and any other XPS components)
* Print and Document Services - Internet Printing Client & Windows Fax and Scan
* Windows PowerShell 2.0 (current version is 5+ as of 2021-03-05)
* Laptop: change touchpad sensitivity to medium or high in order to prevent mouse movement when palm
touches the pad while typing.
* If using a Lenovo then disable touchpad lock in the Lenovo Vantage app.
* Map caps to left-ctrl using sharpkeys
* Work folders client
* Restore classic Windows Photo Viewer app (the default Win10 photos app is fucking awful):
* Run photo_viewer.reg from this folder.
@ -72,18 +122,10 @@
* Open C:/Windows/System32/Drivers/etc/hosts
* Add contents of the hosts file from this directory
* Restart PC
* Note: POS Windows may periodically reset this file to the default state so you'll want to
check it every so often.
* Note: Windows Defender is going to alert you about the change. Tell it to ignore. Also, POS Windows will periodically reset this file to the default state so you'll want to check it every so often.
* Change explorer options so that file extensions are always displayed.
* Disable the WinSAT task which is used to figure out your Windows performance score. It eats up
processor time and is generally useless.
* Open task scheduler.
* **note** If you see an error about a selected task {0} no longer existing then you'll need
to repair the task scheduler. See
https://www.thewindowsclub.com/the-selected-task-0-no-longer-exists-error-in-task-scheduler
* Go to `Local` -> `Microsoft` -> `Maintenance` and disable the WinSAT task.
* Install the Windows SDK https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
* Will install to c:\Program Files (x86)\Windows Kits\10
* Setup a symbol server:
* Right-click My Computer -> Properties -> Advanced Tab -> Environment Variables
@ -93,194 +135,15 @@ processor time and is generally useless.
* Configure crash dump storage location for projects via the registry.
* Increase TDR setting for GPU Driver
* TDR determines the length of time that a GPU can hang on a computation until the OS restarts
the driver. By default this is set to a few seconds so you can experience app crashes when
using GPU intensive software, like 3D modeling or texturing. To increase the duration, follow
this guide: https://web.archive.org/web/20191107173337/https://docs.substance3d.com/spdoc/gpu-drivers-crash-with-long-computations-128745489.html
* Disable various web trackers using browserleaks.com as a guide.
* e.g. disable WebGL, canvas fingerprinting, geolocation, font fingerprint, etc.
## Windows 7 Stuff
* Turn off various startup processes
* ctrl+shift+esc -> startup
* Enable clear text
* Disable Win 7 Fault Tolerant Heap
* I know know why anyone would want to spend large amounts of CPU time to hide application instability.
* https://docs.microsoft.com/en-us/windows/desktop/Win7AppQual/fault-tolerant-heap
* Disable on system via regedit: set the REG_DWORD value `HKLM\\Software\\Microsoft\\FTH\\Enabled` to `0`.
* Disable unneeded services
## Windows 10 Stuff
* Disable the Windows Customer Experience Improvement program via group policy
https://www.ghacks.net/2016/10/26/turn-off-the-windows-customer-experience-program/
* Install the Windows SDK https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk
* Will install to c:\Program Files (x86)\Windows Kits\10
* Download [O&O ShutUp10](https://www.oo-software.com/en/shutup10) and disable things.
## Setup Terminal
* Install [MSYS2 w/ MinGW-w64](http://www.msys2.org/) to `C:\msys64`
* MinGW is intended for developing native Windows applications. MSYS is for developing software
that runs inside of the MSYS2 posix-like env with FHS style filesystem naming (i.e. MSYS2
tools/packages).
* Open `C:\msys64\mingw64.exe`
* Run `pacman -Syu`, then restart the terminal and run `pacman -Su`.
* Run `pacman -S base-devel mingw-w64-x86_64-toolchain bc`
* Use `C:\Users\<user>` as the terminal $HOME by editing `C:\msys64\etc\nsswitch.conf` and
changing the `db_home` value to `windows`.
* You may need to work around an issue with envsubst.exe - you'll know there's a bug if git
displays `not a valid identifier line 89: export: dashless` or rebase complains about `new_count`.
* To patch, cd into `/mingw64/bin` and run `mv envsubst.exe envsubst.exe_backup`. Now run `pacman -S gettext`
and verify that `which envsubst` reports back `/usr/bin/envsubst`.
* Bug report is at https://github.com/Alexpux/MSYS2-packages/issues/735
* Use `C:\msys64\mingw64.exe` if you want to compile native binaries and `C:\msys64\msys2.exe` to build msys binaries.
* You can also load the shell with a batch file. This allows you to do some setup work, like run `vcvarsall.bat`, eg.
```batch
REM saved as shell-64.bat
@echo off
REM For VS2015:
call "drive:\path-to-vs2015\VC\vcvarsall.bat" x64
REM For VS2017:
REM call "drive:\path-to-vs2017\VC\Auxiliary\Build\vcvarsall.bat" x64
REM For VS2019:
REM call "drive:\path-to-vs2019\VC\Auxiliary\Build\vcvarsall.bat" x64
REM Disable CRT heap debug stuff. See https://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger/
set _NO_DEBUG_HEAP=1
call C:\msys64\msys2_shell.cmd -mingw64 -use-full-path
exit
```
* This will launch a 64-bit env. If you need 32-bit then replace x64 above with x86.
* Now you can make a system32 cmd line shortcut that will be used to launch the batch file. e.g.
* `target:` `%windir%\System32\cmd.exe /k drive:\path-to-bat-file\shell-64.bat`
* `start in:` `drive:\some-path`
* Setup git completions for bash (note: shouldn't have to do this if you ran the install script):
* `curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash`
### 32-bit dev tools
* Load a 32-bit shell
* Install toolchain: `pacman -S mingw-w64-i686-toolchain`
## Setting up dev tools
* Download the Windows 2003 Resource Kit in order to get tools like `list.exe` (command line hex
editor)
* URL: https://www.microsoft.com/en-us/download/details.aspx?id=17657
* Installer will display a compatibility warning. Ignore it.
* Full list of tools can be found here
https://www.technlg.net/windows/download-windows-resource-kit-tools/
## Setting up Vim
### Compiling on Windows (optional)
* Open the shell with `C:\msys64\msys2_shell.cmd` -- If you don't do this then vim will not compile.
* Run `pacman -S --needed base-devel msys2-devel gawk perl python2 python3 ruby libiconv ncurses-devel libcrypt-devel`
* Clone MSYS2 packages: `https://github.com/msys2/MSYS2-packages`
* cd into the vim package
* Edit `PKGBUILD` and change the version number to the one you want to build. You can see the available versions at `https://github.com/vim/vim`
* Run `makepkg`
* If checksums fail then generate new ones: `makepkg -g -f -p PKGBUILD`, copy the output, edit `PKGBUILD` and replace the checksums array with the new values.
* Run `makepkg` again
* If it fails to apply a patch then you'll need to make the fixes yourself:
* Clone vim (`https://github.com/vim/vim`), cd into `vim/src`.
* Modify the file(s) that they failed patch was changing and make the correct fixes.
* Commit the change.
* Generate a patch file with `git diff commitid1 commitid2 > newpatch.patch`
* Copy the patch to `MSYS2-packages/vim` and use the same name as the original patch that failed.
* Regen the pkg checksums and add them to `PKGBUILD`.
* Run `makepkg` again.
* Once built, install it with `pacman -U ${package-name}*.pkg.tar.xz`
### Configuring
1. Open Vim and run `:PlugInstall` to fetch all plugins.
2. Create a tmp folder for swap files (i.e. `set directory` and `set backupdir`). Place these
at `~/.vimrc.private` so that the main vimrc file can source it. We do it this way so that you
can have a tmp folder path that is specific to your setup.
### Setting up Custom Search
* First install Rust. See `Setting up Rust` below.
* Setup `ripgrep`:
* Open an `msvc x64` shell and run `cargo install ripgrep`. **Note** the last time I did this
I got linker errors saying that it was trying to link an x86 exe in a 64-bit env. I had to run
the `msvc x86` shell instead.
* Verify it works by running `rg` in a shell.
* You may get compilation errors when updating the package. This are likely the result of having an outdated Rust compiler. Try running `rustup update` and then retry the package installation.
### Setting up ctags
* Download the latest Universal ctags build: https://github.com/universal-ctags/ctags-win32/releases
* Place ctags.exe and readtags.exe in `~/bin` or in `~/.dev/tools`.
## Setting up Visual Studio
* Use an install path with no spaces in it `/x/programs/vs15`
* Select custom install and check off the C++ language support.
* Once installed, open Visual Studio and go to `Tools` -> `Options`. Open `Debugging` -> `Symbols`
and add the path to the cached symbols directory that you set up above under `Setup a symbol server`.
* Open the `Visual Studio Layout` folder in this directory and copy the file to `%LOCALAPPDATA%/Microsoft/VisualStudio/{VisualStudioInstanceID}`.
You can now apply the custom layout in VS: `Window -> Apply Window Layout -> Campo`
## Setting up Cygwin
* Can create symlinks to dotfiles using the git bash shell. The cygwin home directory
is likely going to be `C:\cygwin\home\<username>`.
* Build [rlwrap](https://github.com/hanslub42/rlwrap)
## Setting up Rust
* Install `rustup`: https://win.rustup.rs/
## Setting up Go
* Installer: https://golang.org/doc/install
## Setting up Clojure
* Install Lein: https://raw.githubusercontent.com/technomancy/leiningen/stable/bin/lein.bat
## Setting up Xbox stuff
* Install the xbox controller drivers
* Turn off stats collection
* cmd-r, msconfig.exe, startup tab, uncheck `Microsoft Xbox 360 Accessories`.
## Turn off various startup processes
* cmd-r -> msconfig.exe -> startup tab
## Setting up Wacom tablet
* Install the shitty Wacom driver.
* Preemptively deal with future issues in Photoshop by saving the `PSUserConfig.txt` file
in this directory to `%APPDATA%\Adobe\Adobe Photoshop XX\Adobe Photoshop XX Settings` (should take you to AppData/Roaming)
* In Wacom tablet settings look at the mapping tab and make sure "Use Windows Ink" is unchecked.
* These steps are from [FlippedNormals - Fixing All Issues with Your Wacom Tablet and Photoshop](https://www.youtube.com/watch?v=sGi47EWEkuY)
## Software
* Install [Desktop Restore](http://www.midiox.com/index.htm?http://midiox.com/desktoprestore.htm)
* Install Android platform tools to get adb.exe:
* Download [Android commandline tools](https://developer.android.com/studio/#downloads)
* Unzip and place the contents into the folders `cmdline-tools/tools/`
* Run the sdkmanager.bat script to install the tools: `$ ./cmdline-tools/tools/bin/sdkmanager.bat "platform-tools"`
* You can now add the platform-tools dir to your path if you want, or just symlink `adb` to `~/bin`.
### Youtube-DL
* In order to combine audio and video files you need ffmpeg. Download from https://ffmpeg.zeranoe.com/builds/
and place the exe's in `~/bin`.
### Spotify
* If you install an older version then you'll need to block the auto updater:
* Go to `%APPDATA%\Spotify` and create `Spotify_new.exe` and `Spotify_new.exe.sig`
* Set both as read-only. I did this by denying all permissions to the active user account.
* Spotify caches song data in `C:\Users\<user>\AppData\Local\Spotify\Data` and this path cannot be
modified within the app settings. This is an issue if your main drive is an SSD, as you want to
limit the amount of writes to it and you may not have a lot of free space. The simplest way I
found to stop this is to change the `Data` folder's permissions (under the Security tab) and deny
all properties for the user account.
* Do a pass over all Windows setting screens for anything obvious that wasn't covered here.
* Open the Windows settings Apps & features and remove bloatware that isn't visible in the
control panel add/remove list, e.g. OneDrive