From d1423bfe009b84c022189694d1a1cd5d93d9abdd Mon Sep 17 00:00:00 2001 From: Yorick Barbanneau Date: Sat, 23 Sep 2023 19:50:21 +0200 Subject: [PATCH] Add vifm program and dependencies --- home-manager/cli/default.nix | 1 + home-manager/cli/vifm/default.nix | 10 + .../cli/vifm/files/base16-default-dark.vifm | 29 ++ home-manager/cli/vifm/files/vifmrc | 326 ++++++++++++++++++ 4 files changed, 366 insertions(+) create mode 100644 home-manager/cli/vifm/default.nix create mode 100644 home-manager/cli/vifm/files/base16-default-dark.vifm create mode 100644 home-manager/cli/vifm/files/vifmrc diff --git a/home-manager/cli/default.nix b/home-manager/cli/default.nix index b7ac4e9..07e30b4 100644 --- a/home-manager/cli/default.nix +++ b/home-manager/cli/default.nix @@ -6,5 +6,6 @@ ./pass.nix ./gnupg.nix ./neovim.nix + ./vifm ]; } diff --git a/home-manager/cli/vifm/default.nix b/home-manager/cli/vifm/default.nix new file mode 100644 index 0000000..4b613dd --- /dev/null +++ b/home-manager/cli/vifm/default.nix @@ -0,0 +1,10 @@ +{ pkgs, ...}: +{ + home.packages = with pkgs; [ + vifm + chafa + ]; + + home.file.".config/vifm/vifmrc".source = ./files/vifmrc; + home.file.".config/vifm/colors/base16-default-dark.vifm".source = ./files/base16-default-dark.vifm; +} diff --git a/home-manager/cli/vifm/files/base16-default-dark.vifm b/home-manager/cli/vifm/files/base16-default-dark.vifm new file mode 100644 index 0000000..41a106e --- /dev/null +++ b/home-manager/cli/vifm/files/base16-default-dark.vifm @@ -0,0 +1,29 @@ +highlight clear + +highlight Win cterm=none ctermfg=7 ctermbg=0 +highlight OtherWin cterm=none ctermfg=20 ctermbg=18 +highlight Border cterm=none ctermfg=7 ctermbg=0 +highlight AuxWin cterm=none ctermfg=7 ctermbg=18 + +highlight TopLine cterm=bold ctermfg=7 ctermbg=18 +highlight TopLineSel cterm=bold ctermfg=0 ctermbg=5 + +highlight CmdLine cterm=none ctermfg=7 ctermbg=0 +highlight ErrorMsg cterm=bold ctermfg=1 ctermbg=0 +highlight StatusLine cterm=none ctermfg=7 ctermbg=18 +highlight JobLine cterm=bold ctermfg=5 ctermbg=0 +highlight SuggestBox cterm=bold ctermfg=7 ctermbg=8 +highlight WildMenu cterm=bold ctermfg=7 ctermbg=18 + +highlight CurrLine cterm=bold,inverse ctermfg=default ctermbg=default +highlight OtherLine cterm=bold ctermfg=default ctermbg=19 +highlight Selected cterm=bold ctermfg=16 ctermbg=18 +highlight LineNr cterm=none ctermfg=7 ctermbg=0 + +highlight Directory cterm=bold ctermfg=4 ctermbg=default +highlight Link cterm=none ctermfg=6 ctermbg=default +highlight BrokenLink cterm=none ctermfg=6 ctermbg=default +highlight Socket cterm=bold ctermfg=16 ctermbg=default +highlight Device cterm=none ctermfg=1 ctermbg=default +highlight Fifo cterm=none ctermfg=5 ctermbg=default +highlight Executable cterm=bold ctermfg=2 ctermbg=default diff --git a/home-manager/cli/vifm/files/vifmrc b/home-manager/cli/vifm/files/vifmrc new file mode 100644 index 0000000..1ffab40 --- /dev/null +++ b/home-manager/cli/vifm/files/vifmrc @@ -0,0 +1,326 @@ +" vim: filetype=vifm : + +" Command used to edit files in various contexts. The default is vim. +" If you would like to use another vi clone such as Elvis or Vile +" you will need to change this setting. +if executable('vim') + set vicmd=vim +elseif executable('nvim') + set vicmd=nvim +elseif executable('elvis') + set vicmd=elvis\ -G\ termcap +elseif executable('vile') + set vicmd=vile +elseif $EDITOR != '' + echo 'Note: using `'.$EDITOR.'` as an editor' + let &vicmd = $EDITOR +endif + +" This makes vifm perform file operations on its own instead of relying on +" standard utilities like `cp`. While using `cp` and alike is a more universal +" solution, it's also much slower when processing large amounts of files and +" doesn't support progress measuring. +set syscalls + +" Trash Directory +" The default is to move files that are deleted with dd or :d to +" the trash directory. If you change this you will not be able to move +" files by deleting them and then using p to put the file in the new location. +" I recommend not changing this until you are familiar with vifm. +" This probably shouldn't be an option. +set trash + +" What should be saved automatically on restarting vifm. Drop "savedirs" +" value if you don't want vifm to remember last visited directories for you. +set vifminfo=dhistory,chistory,state,tui,shistory, + \phistory,fhistory,dirstack,registers,bookmarks,bmarks + +" This is how many directories to store in the directory history. +set history=100 + +" Automatically resolve symbolic links on l or Enter. +set nofollowlinks + +" Natural sort of (version) numbers within text. +set sortnumbers + +" Maximum number of changes that can be undone. +set undolevels=100 + +" Use Vim's format of help file (has highlighting and "hyperlinks"). +" If you would rather use a plain text help file set novimhelp. +set vimhelp + +" If you would like to run an executable file when you +" press Enter, l or Right Arrow, set this. +set norunexec + +" List of color schemes to try (picks the first one supported by the terminal) +colorscheme base16-default-dark + +" Format for displaying time in file list. For example: +" TIME_STAMP_FORMAT=%m/%d-%H:%M +" See man date or man strftime for details. +set timefmt='%Y/%m/%d %H:%M' + +" Show list of matches on tab completion in command-line mode +set wildmenu + +" Display completions in a form of popup with descriptions of the matches +set wildstyle=popup + +" Display suggestions in normal, visual and view modes for keys, marks and +" registers (at most 5 files). In other view, when available. +set suggestoptions=normal,visual,view,otherpane,keys,marks,registers + +" Ignore case in search patterns unless it contains at least one uppercase +" letter +set ignorecase +set smartcase + +" Don't highlight search results automatically +set nohlsearch + +" Use increment searching (search while typing) +set incsearch + +" Try to leave some space from cursor to upper/lower border in lists +set scrolloff=4 + +" Don't do too many requests to slow file systems +if !has('win') + set slowfs=curlftpfs +endif +set milleroptions=lsize:1,csize:1,rsize:1,rpreview:all + +" set custom status line look +set statusline=" Hint: %z%= %A %10u:%-7g %15s %20d " + +"------------------------------------------------------------------------------ +" Bookmarks +" ------------------------------------------------------------------------------ + +" :mark mark /full/directory/path [filename] + +mark b ~/.local/bin/ +mark h ~/ + +" ------------------------------------------------------------------------------ +" Commands +" ------------------------------------------------------------------------------ + +" :com[mand][!] command_name action +" +" These are some of the macros that can be used in the action part: +" %a for user arguments +" %c for current file under the cursor +" %C for current file under the cursor of inactive pane +" %f for selected file(s) +" %F for selected file(s) of inactive pane +" %b is the same as %f %F +" %d for current directory name +" %D for current directory name of inactive pane +" %r{x} for list of files in register {x} +" %m runs the command in a menu window +" %u uses command's output to build a file list +" see `:help vifm-macros` and `:help vifm-filename-modifiers` for more + +command! df df -h %m 2> /dev/null +command! diff vim -d %f %F +command! zip zip -r %c.zip %f +command! run !! ./%f +command! make !!make %a +command! mkcd :mkdir %a | cd %a +command! vgrep vim "+grep %a" +command! reload :write | restart full + +" ------------------------------------------------------------------------------ +" File types association +" ------------------------------------------------------------------------------ + +" :filetype pattern1,pattern2 defaultprogram,program2 +" :fileviewer pattern1,pattern2 consoleviewer +" +" The first entry is the default program to be used with a matching file. +" The other programs for the file type can be accessed via :file command. +" The command macros like %f, %F, %d, %D may be used in the commands. +" The %a macro is ignored. To use a % you must put %%. +" Spaces in an app name must be escaped, for example: QuickTime\ Player.app + +" For automated FUSE mounts, you must register an extension with :file[x]type +" in one of the following formats: +" +" :filetype patterns FUSE_MOUNT|mount_cmd %SOURCE_FILE %DESTINATION_DIR +" +" %SOURCE_FILE and %DESTINATION_DIR are filled in at runtime. +" +" Example: +" :filetype *.zip,*.[jwe]ar FUSE_MOUNT|fuse-zip %SOURCE_FILE %DESTINATION_DIR +" +" :filetype patterns FUSE_MOUNT2|mount_cmd %PARAM %DESTINATION_DIR +" +" %PARAM and %DESTINATION_DIR are filled in at runtime. +" +" Example: +" :filetype *.ssh FUSE_MOUNT2|sshfs %PARAM %DESTINATION_DIR +" +" %PARAM value is the first line of the matched file, example: root@127.0.0.1:/ +" +" You can also add %CLEAR if you want to clear screen before running FUSE +" program. There is also %FOREGROUND, which is useful for entering passwords. + +fileviewer .*/,*/ ls --group-directories-first --classify --color %c +fileviewer {*.pdf}, pdftotext -nopgbrk %c - +fileviewer {*.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm}, + \ chafa -f sixel -s %pwx%ph %c:p %pd %N 2>/dev/null +fileviewer *.zip,*.jar,*.war,*.ear,*.oxt tar -tf %f +fileviewer *.tgz,*.tar.gz tar -tzf %c +fileviewer *.tar.bz2,*.tbz2 tar -tjf %c +fileviewer *.tar.xz,*.txz tar -tJf %c +fileviewer *.tar.zst,*.tzst tar -t --zstd -f %c +fileviewer {*.tar}, tar -tf %c + +" rar archives +fileviewer {*.rar}, unrar v %c + +fileviewer {*.7z}, 7z l %c +fileviewer bat --color always --wrap never --pager never %c -p +filetype * xdg-open +" Customize view columns a bit (enable ellipsis for truncated file names) +set viewcolumns=-{name}..,6{}. + +" Show vertical border +set fillchars=vborder:│ + +" Filter-out build and temporary files +" filter! {*.lo,*.o,*.d,*.class,*.pyc,*.pyo,.*~} + +" ------------------------------------------------------------------------------ +" Sample keyboard mappings +" ------------------------------------------------------------------------------ + +" Start shell in current directory +nnoremap s :shell + +" Display sorting dialog +nnoremap S :sort + +" Toggle visibility of preview window +nnoremap w :view +vnoremap w :viewgv + +if $DISPLAY && executable('gvim') + " Open file in existing instance of gvim + nnoremap o :!gvim --remote-tab-silent %f + " Open file in new instance of gvim + nnoremap O :!gvim %f +endif + +" Open file in the background using its default program +nnoremap gb :file &l + +" Interaction with system clipboard +if has('win') + " Yank current directory path to Windows clipboard with forward slashes + nnoremap yp :!echo %"d:gs!\!/! %i | clip + " Yank path to current file to Windows clipboard with forward slashes + nnoremap yf :!echo %"c:gs!\!/! %i | clip +elseif $WAYLAND_DISPLAY + if executable('wl-copy') + " Yank current directory path into primary and selection clipboards + nnoremap yd :!echo -n %d | wl-copy %i && + \ echo -n %d | wl-copy -p %i + " Yank current file path into into primary and selection clipboards + nnoremap yf :!echo -n %c:p | wl-copy %i && + \ echo -n %c:p | wl-copy -p %i + endif +elseif $DISPLAY + if executable('xclip') + " Yank current directory path into the clipboard + nnoremap yd :!echo %d | xclip %i + " Yank current file path into the clipboard + nnoremap yf :!echo %c:p | xclip %i + elseif executable('xsel') + " Yank current directory path into primary and selection clipboards + nnoremap yd :!echo -n %d | xsel --input --primary %i && + \ echo -n %d | xsel --clipboard --input %i + " Yank current file path into into primary and selection clipboards + nnoremap yf :!echo -n %c:p | xsel --input --primary %i && + \ echo -n %c:p | xsel --clipboard --input %i + endif +endif + +" Mappings for faster renaming +nnoremap I cw +nnoremap cc cw +nnoremap A cw + +" As above, but without the file extension +" nnoremap I cW +" nnoremap cc cW +" nnoremap A cW + +" Open console in current directory +if $DISPLAY && executable('xterm') + nnoremap ,t :!xterm & +elseif $TERMINAL + nnoremap ,t :!$TERMINAL & +endif + +" Open editor to edit vifmrc and apply settings after returning to vifm +nnoremap ,c :write | edit $MYVIFMRC | restart full + +" Open gvim to edit vifmrc +if $DISPLAY && executable('gvim') + nnoremap ,C :!gvim --remote-tab-silent $MYVIFMRC & +endif + +" Toggle wrap setting on ,w key +nnoremap ,w :set wrap! + +" Example of standard two-panel file managers mappings +nnoremap :!less %f +nnoremap :edit +nnoremap :copy +nnoremap :move +nnoremap :mkdir +nnoremap :delete + +" Midnight commander alike mappings +" Open current directory in the other pane +nnoremap :sync +" Open directory under cursor in the other pane +nnoremap :sync %c +" Swap panes +nnoremap x + +" ------------------------------------------------------------------------------ +" Various customization examples +" ------------------------------------------------------------------------------ + +" Use ag (the silver searcher) instead of grep +" set grepprg='ag --line-numbers %i %a %s' + +" Add additional place to look for executables +" let $PATH = $HOME.'/bin/fuse:'.$PATH + +" Block particular shortcut +" nnoremap + +" Export IPC name of current instance as environment variable and use it to +" communicate with the instance later. +" +" It can be used in some shell script that gets run from inside vifm, for +" example, like this: +" vifm --server-name "$VIFM_SERVER_NAME" --remote +"cd '$PWD'" +" +" let $VIFM_SERVER_NAME = v:servername + +" Activate screen/tmux support +" screen! + +" ------------------------------------------------------------------------------ +" Icon decorations example +" ------------------------------------------------------------------------------ + +" https://github.com/cirala/vifm_devicons