Improve fzf commands with fd, bat or lesspipe
This commit is contained in:
parent
fe655567b0
commit
e115b1875d
433
zshrc
433
zshrc
|
@ -1430,7 +1430,6 @@ else ## Simple utilisateur
|
|||
export PS1="$heure $host $repertoire_courant$noroot $normal"
|
||||
fi
|
||||
|
||||
|
||||
# Prise en charge des touches [début], [fin] et autres
|
||||
typeset -A key
|
||||
|
||||
|
@ -1806,7 +1805,7 @@ setopt extendedglob
|
|||
if [ -d ~/.fzf ]; then
|
||||
|
||||
if [[ ! "$PATH" == *"${HOME}"/.fzf/bin* ]]; then
|
||||
export PATH="$PATH:${HOME}/.fzf/bin"
|
||||
export PATH="$PATH:${HOME}/.fzf/bin"
|
||||
fi
|
||||
|
||||
if [ -f ~/bin/fd ]; then
|
||||
|
@ -1821,157 +1820,326 @@ fi
|
|||
# ------------
|
||||
source "${HOME}/.fzf/shell/key-bindings.zsh"
|
||||
|
||||
# ff - cd to selected directory (exclude hidden directories
|
||||
# ff - cd to selected directory exclude hidden directories and their content {{{
|
||||
# Search with find (fd|fdfind overkill the CPU for few benefits on small tree)
|
||||
# Check for symlinked directories too
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview tree of the directory
|
||||
# Move to the selected directory
|
||||
ff() {
|
||||
local dir
|
||||
dir=$(find ${1:-.} -path '*/\.*' -prune \
|
||||
-o -type d -print 2> /dev/null | fzf +m) &&
|
||||
cd "$dir"
|
||||
}
|
||||
|
||||
# ffh - hidden directories only
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
dir=$(find . -xtype d -not -path "*/.*" | fzf --height=50% --preview 'exa --tree --level 2 {} | head --lines=20' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
dir=$(find . -xtype d -not -path "*/.*" | fzf --height=50% --preview 'exa --tree --level 2 {} | head --lines=20' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
cd -- "${dir}"
|
||||
}
|
||||
# }}}
|
||||
# ffh - cd to selected directory (hidden only) {{{
|
||||
# Search with find (fd|fdfind overkill the CPU for few benefits on small tree)
|
||||
# Check for symlinked directories too
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview tree of the directory
|
||||
# Move to the selected directory
|
||||
ffh() {
|
||||
local dir
|
||||
dir=$(find ${1:-.} -type d 2> /dev/null | fzf +m) && cd "$dir"
|
||||
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
dir=$(find . -xtype d -path "*/.*" | fzf --height=50% --preview 'exa --tree --level 2 {} | head --lines=20' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
dir=$(find . -xtype d -path "*/.*" | fzf --height=50% --preview 'exa --tree --level 2 {} | head --lines=20' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
cd -- "${dir}"
|
||||
}
|
||||
# }}}
|
||||
# ffa - cd to any directory from / {{{
|
||||
# Search with fd (fdfind is perfect to search on /)
|
||||
# Check for symlinked directories too
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview tree of the directory
|
||||
# Move to the selected directory
|
||||
ffa() {
|
||||
local dir
|
||||
|
||||
# ffa - all directories
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
dir=$(fd -uu --search-path / --type d --type symlink | fzf --height=50% --preview 'exa --tree --level 1 {} | head --lines=20' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
dir=$(fd -uu --search-path / --type d --type symlink | fzf --height=50% --preview 'exa --tree --level 1 {} | head --lines=20' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
# ffr - cd to selected parent directory
|
||||
ffr() {
|
||||
cd -- "${dir}"
|
||||
}
|
||||
# }}}
|
||||
# ffu - cd to selected parent directory {{{
|
||||
ffu() {
|
||||
local declare dirs=()
|
||||
local dir
|
||||
|
||||
## Function to list parents of the given directory {{{
|
||||
get_parent_dirs() {
|
||||
if [[ -d "${1}" ]]; then dirs+=("$1"); else return; fi
|
||||
if [[ "${1}" == '/' ]]; then
|
||||
for _dir in "${dirs[@]}"; do echo $_dir; done
|
||||
else
|
||||
get_parent_dirs $(dirname "$1")
|
||||
get_parent_dirs $(dirname "${1}")
|
||||
fi
|
||||
}
|
||||
local DIR=$(get_parent_dirs $(realpath "${1:-$PWD}") | fzf-tmux --tac)
|
||||
cd "$DIR"
|
||||
}
|
||||
## }}}
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
dir=$(get_parent_dirs $(realpath "${PWD}") | fzf --tac --height=50% --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
dir=$(get_parent_dirs $(realpath "${PWD}") | fzf --tac --height=50% --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
# fff - cd into the directory of the selected file
|
||||
cd -- "${dir}"
|
||||
}
|
||||
# }}}
|
||||
# fff - cd to the directory of the selected file {{{
|
||||
# Search with find (fd|fdfind overkill the CPU for few benefits on small tree)
|
||||
# Check for symlinked files too
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a directory preview tree of the selected file with exa
|
||||
# Move to the directory of the selected file
|
||||
fff() {
|
||||
local file
|
||||
local dir
|
||||
file=$(fzf +m -q "$1") && dir=$(dirname "$file") && cd "$dir"
|
||||
}
|
||||
|
||||
# cf - fuzzy cd from anywhere
|
||||
# ex: cf word1 word2 ... (even part of a file name)
|
||||
# zsh autoload function
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
file=$(find . -xtype f | fzf --height=50% --preview 'exa --tree --level 2 $(dirname {}) | head --lines=20' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
file=$(find . -xtype f | fzf --height=50% --preview 'exa --tree --level 2 $(dirname {}) | head --lines=20' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
dir=$(dirname "${file}")
|
||||
cd -- "${dir}"
|
||||
}
|
||||
# }}}
|
||||
# cf - fuzzy cd from anywhere {{{
|
||||
# Search with fd (fdfind is perfect to search on /)
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a directory preview tree of the selected file with exa
|
||||
# Move to the directory of the selected file
|
||||
cf() {
|
||||
local file
|
||||
|
||||
file="$(locate -Ai -0 $@ | grep -z -vE '~$' | fzf --read0 -0 -1)"
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
#file="$(locate -Ai -0 $@ | grep -z -vE '~$' | fzf --read0 -0 -1)"
|
||||
file=$(fd -uu --search-path / | fzf --height=50% --preview 'exa --tree --level 1 $(dirname {}) | head --lines=20' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
file=$(fd -uu --search-path / | fzf --height=50% --preview 'exa --tree --level 1 $(dirname {}) | head --lines=20' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
if [[ -n $file ]]
|
||||
if [[ -n "${file}" ]]
|
||||
then
|
||||
if [[ -d $file ]]
|
||||
if [[ -d "${file}" ]]
|
||||
then
|
||||
cd -- $file
|
||||
### If it's a directory, cd
|
||||
cd -- "${file}"
|
||||
else
|
||||
cd -- ${file:h}
|
||||
### If it's a file, cd to the directory
|
||||
cd -- "${file:h}"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
# }}}
|
||||
|
||||
fi
|
||||
|
||||
# v - fuzzy open with vi from current directory
|
||||
# cd into the directory of the selected file
|
||||
# open the selected file with vi
|
||||
# v - fuzzy open file with vi from current directory {{{
|
||||
# Search with fd (fdfind is perfect to search more than ~200k files)
|
||||
# Check for symlinked files too
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display the 50 first lines of the selected file with bat (batcat)
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with vi
|
||||
v() {
|
||||
local files
|
||||
local dir
|
||||
local file
|
||||
|
||||
files=$(find ${1:-.} -path '*/\.*' -prune \
|
||||
-o -print 2> /dev/null | fzf +m) &&
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd -uu --type file --type symlink | fzf --preview 'bat --color=always --line-range 0:50 {}' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd -uu --type file --type symlink | fzf --preview 'bat --color=always --line-range 0:50 {}' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
if [[ -n $files ]]
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n "${files}" ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
cd -- "${dir}"
|
||||
file=$(basename "${files}")
|
||||
vi -- "${file}"
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
|
||||
# Try to give the real creation time of a file
|
||||
xstat() {
|
||||
for target in "${@}"; do
|
||||
inode=$(ls -di "${target}" | cut -d ' ' -f 1)
|
||||
fs=$(df "${target}" | tail -1 | awk '{print $1}')
|
||||
crtime=$(sudo debugfs -R 'stat <'"${inode}"'>' "${fs}" 2>/dev/null |
|
||||
grep -oP 'crtime.*--\s*\K.*')
|
||||
printf "%s\t%s\n" "${crtime}" "${target}"
|
||||
done
|
||||
}
|
||||
fi
|
||||
|
||||
# PDF with fzf {{{
|
||||
# pdf - fuzzy open with "${PDF_VIEWER}" from current directory
|
||||
# cd into the directory of the selected file
|
||||
# open the selected file with "${PDF_VIEWER}"
|
||||
# pdf − fuzzy open PDF file with "${PDF_VIEWER}" from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview of selected file with lesspipe
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with "${PDF_VIEWER}"
|
||||
pdf() {
|
||||
local files
|
||||
local dir
|
||||
local file
|
||||
|
||||
files=$(find ${1:-.} -iname "*.pdf" 2> /dev/null | fzf +m) &&
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
cd -- "${dir}"
|
||||
file=$(basename "${files}")
|
||||
"${PDF_VIEWER}" -- "${file}"
|
||||
fi
|
||||
}
|
||||
|
||||
# pdfe - fuzzy open with evince from current directory
|
||||
# cd into the directory of the selected file
|
||||
# open the selected file with evince
|
||||
pdfe() {
|
||||
local files
|
||||
|
||||
files=$(find ${1:-.} -iname "*.pdf" 2> /dev/null | fzf +m) &&
|
||||
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
file=$(basename "${files}")
|
||||
evince -- "${file}"
|
||||
fi
|
||||
}
|
||||
|
||||
# pdfz - fuzzy open with zathura from current directory
|
||||
# cd into the directory of the selected file
|
||||
# open the selected file with zathura
|
||||
pdfz() {
|
||||
local files
|
||||
|
||||
files=$(find ${1:-.} -iname "*.pdf" 2> /dev/null | fzf +m) &&
|
||||
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
file=$(basename "${files}")
|
||||
zathura -- "${file}"
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
# LibreOffice with fzf {{{
|
||||
# pdfe − fuzzy open PDF file with evince from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview of selected file with lesspipe
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with evince (default rollback to "${PDF_VIEWER}")
|
||||
pdfe() {
|
||||
local files
|
||||
local dir
|
||||
local file
|
||||
local evince_bin
|
||||
|
||||
# odt - fuzzy open wordprocessor related files
|
||||
# Look for some known extensions (odt, rtf, doc,…).
|
||||
# cd into the directory of the selected file.
|
||||
# Open in background the selected file with libreoffice-writer.
|
||||
## If evince is available {{{
|
||||
if [ $(command -v evince) ]; then
|
||||
evince_bin=$(command -v evince)
|
||||
else
|
||||
evince_bin="${PDF_VIEWER}"
|
||||
fi
|
||||
## }}}
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
file=$(basename "${files}")
|
||||
"${evince_bin}" -- "${file}"
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
# pdfz - fuzzy open with zathura from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Display a preview of selected file with lesspipe
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with zathura (default rollback to "${PDF_VIEWER}")
|
||||
pdfz() {
|
||||
local files
|
||||
local dir
|
||||
local file
|
||||
local zathura_bin
|
||||
|
||||
## If zathura is available {{{
|
||||
if [ $(command -v zathura) ]; then
|
||||
zathura_bin=$(command -v zathura)
|
||||
else
|
||||
zathura_bin="${PDF_VIEWER}"
|
||||
fi
|
||||
## }}}
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.pdf$" | fzf --preview 'lesspipe {} | less' --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd "${dir}"
|
||||
file=$(basename "${files}")
|
||||
"${zathura_bin}" -- "${file}"
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
|
||||
# odt − fuzzy open text document file with LibreOffice from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Search for odt|rtf|doc|docx files
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with libreoffice --writer
|
||||
odt() {
|
||||
local files
|
||||
|
||||
files=$(find ${1:-.} -regextype posix-extended -regex ".*\.(odt|rtf|doc|docx)" 2> /dev/null | fzf +m) &&
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(odt|rtf|doc|docx)" | fzf --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(odt|rtf|doc|docx)" | fzf --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
|
@ -1979,17 +2147,29 @@ odt() {
|
|||
file=$(basename "${files}")
|
||||
command libreoffice --writer "${file}" &
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
|
||||
# ods - fuzzy open spreadsheet related files
|
||||
# Look for some known extensions (ods, xls,…).
|
||||
# cd into the directory of the selected file.
|
||||
# Open in background the selected file with libreoffice-calc.
|
||||
# }}}
|
||||
# ods − fuzzy open calc document file with LibreOffice from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Search for ods|xls|xlsx files
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with libreoffice --calc
|
||||
ods() {
|
||||
local files
|
||||
|
||||
files=$(find ${1:-.} -regextype posix-extended -regex ".*\.(ods|xls|xlsx)" 2> /dev/null | fzf +m) &&
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(ods|xls|xlsx)" | fzf --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(ods|xls|xlsx)" | fzf --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
|
@ -1997,17 +2177,29 @@ ods() {
|
|||
file=$(basename "${files}")
|
||||
command libreoffice --calc "${file}" &
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
|
||||
# odp - fuzzy open presentation related files
|
||||
# Look for some known extensions (odp, ppt,…).
|
||||
# cd into the directory of the selected file.
|
||||
# Open in background the selected file with libreoffice-impress.
|
||||
# }}}
|
||||
# odp − fuzzy open presentation document file with LibreOffice from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Search for odp|ppt|pptx files
|
||||
# Allow to give arguments to prefill fzf request
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with libreoffice --impress
|
||||
odp() {
|
||||
local files
|
||||
|
||||
files=$(find ${1:-.} -regextype posix-extended -regex ".*\.(odp|ppt|pptx)" 2> /dev/null | fzf +m) &&
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -eq "0" ]; then
|
||||
## Default command without args
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(odp|ppt|pptx)" | fzf --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "\.(odp|ppt|pptx)" | fzf --no-multi "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
|
@ -2015,7 +2207,40 @@ odp() {
|
|||
file=$(basename "${files}")
|
||||
command libreoffice --impress "${file}" &
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
|
||||
# fopen − fuzzy open file with xdg-open from current directory {{{
|
||||
# Search with fd (fdfind is better than find with a pattern)
|
||||
# Use first argument as fd pattern
|
||||
# Other arguments will prefill fzf request
|
||||
# Move to the directory of the selected file
|
||||
# Open the selected file with xdg-open
|
||||
fopen() {
|
||||
local files
|
||||
|
||||
## Manage argument {{{
|
||||
if [ "${#}" -le "1" ]; then
|
||||
## Default command with one argument or default value
|
||||
files=$(fd --unrestricted --type file --type symlink "${1:-.}" | fzf --no-multi) &&
|
||||
else
|
||||
## If at least one argument was given, add it to fzf query
|
||||
files=$(fd --unrestricted --type file --type symlink "${1:-.}" | fzf --no-multi --query "${*} ") &&
|
||||
fi
|
||||
## }}}
|
||||
|
||||
## Move to the directory and open the file {{{
|
||||
if [[ -n $files ]]
|
||||
then
|
||||
dir=$(dirname "${files}")
|
||||
cd -- "${dir}"
|
||||
file=$(basename "${files}")
|
||||
command xdg-open "${file}" &
|
||||
fi
|
||||
## }}}
|
||||
}
|
||||
# }}}
|
||||
|
||||
# }}}
|
||||
# zsh-syntax-highlighting {{{
|
||||
|
|
Loading…
Reference in New Issue