summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'vi.eselect.in')
-rw-r--r--vi.eselect.in190
1 files changed, 190 insertions, 0 deletions
diff --git a/vi.eselect.in b/vi.eselect.in
new file mode 100644
index 0000000..af51482
--- /dev/null
+++ b/vi.eselect.in
@@ -0,0 +1,190 @@
+# -*-eselect-*- vim: ft=eselect
+# Copyright 1999-2020 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+DESCRIPTION="Manage /usr/bin/vi implementations"
+MAINTAINER="vim@gentoo.org"
+VERSION="1.2"
+
+# find a list of vi symlink targets, best first
+find_targets() {
+ local f
+ for f in \
+ "${EROOT}"/usr/bin/vim \
+ "${EROOT}"/usr/bin/nvim \
+ "${EROOT}"/usr/bin/nvi \
+ "${EROOT}"/usr/bin/elvis \
+ "${EROOT}"/usr/bin/vile \
+ "${EROOT}"/usr/bin/gvim \
+ "${EROOT}"/usr/bin/qvim \
+ "${EROOT}"/usr/bin/xvile \
+ "${EROOT}"/usr/bin/pyvim \
+ "${EROOT}"/bin/busybox \
+ ; do
+ if [[ -f "${f}" ]] ; then
+ echo $(basename "${f}" )
+ fi
+ done
+}
+
+# try to remove the vi, ex, view and man vi symlinks
+remove_symlinks() {
+ rm -f "${EROOT}"/usr/bin/{vi,ex,view} &>/dev/null && \
+ rm -f "${EROOT}"/usr/share/man/man1/{vi,ex,view}.1{,.gz,.bz2,.lzma} &>/dev/null
+}
+
+# set a man page symlink
+set_man_symlink() {
+ local target="${1}" link_name="${2}" x extension
+
+ for x in ".1" ".1.bz2" ".1.gz" ".1.lzma"; do
+ if [[ -e ${EROOT}/usr/share/man/man1/${target}${x} ]]; then
+ extension="${x}"
+ break
+ fi
+ done
+
+ if [[ -z "${extension}" ]]; then
+ echo "Couldn't find a man page for ${target}; skipping." 1>&2
+ return 1
+ fi
+
+ ln -s "${target}${extension}" \
+ "${EROOT}/usr/share/man/man1/${link_name}${extension}"
+}
+
+# set the vi, ex, view, and man vi symlinks
+set_symlinks() {
+ local target="${1}" targets
+ if is_number "${target}" && [[ ${target} -ge 1 ]]; then
+ targets=( $(find_targets ) )
+ target=${targets[target-1]}
+ fi
+
+ local dir
+ if [[ ${target} == "busybox" ]]; then
+ dir="${EROOT}/bin"
+ else
+ dir="${EROOT}/usr/bin"
+ fi
+
+ if [[ -f "${dir}/${target}" ]] ; then
+ remove_symlinks
+
+ # it's okay if these fail
+ set_man_symlink "${target}" "vi"
+ set_man_symlink "${target}" "ex"
+ set_man_symlink "${target}" "view"
+
+ # it's not okay if these fail
+ target=$(relative_name "${dir}/${target}" "${EROOT}/usr/bin")
+ ln -s "${target}" "${EROOT}/usr/bin/vi" \
+ || die "Couldn't set ${target} /usr/bin/vi symlink"
+ ln -s "${target}" "${EROOT}/usr/bin/ex" \
+ || die "Couldn't set ${target} /usr/bin/ex symlink"
+ ln -s "${target}" "${EROOT}/usr/bin/view" \
+ || die "Couldn't set ${target} /usr/bin/view symlink"
+ else
+ die -q "Target \"${1}\" doesn't appear to be valid!"
+ fi
+}
+
+### show action ###
+
+describe_show() {
+ echo "Show the current vi implementation"
+}
+
+do_show() {
+ [[ -z "${@}" ]] || die -q "Too many parameters"
+
+ write_list_start "Current vi implementation:"
+ if [[ -L "${EROOT}/usr/bin/vi" ]] ; then
+ write_kv_list_entry "$(basename $(canonicalise ${EROOT}/usr/bin/vi ) )" ""
+ elif [[ -e "${EROOT}/usr/bin/vi" ]] ; then
+ write_kv_list_entry "(not a symlink)" ""
+ else
+ write_kv_list_entry "(unset)" ""
+ fi
+}
+
+### list action ###
+
+describe_list() {
+ echo "List available vi implementations"
+}
+
+do_list() {
+ [[ -z "${@}" ]] || die -q "Too many parameters"
+
+ local i targets
+ targets=( $(find_targets ) )
+ for (( i = 0; i < ${#targets[@]}; i++ )); do
+ [[ ${targets[i]} = \
+ $(basename "$(canonicalise "${EROOT}/usr/bin/vi")") ]] \
+ && targets[i]=$(highlight_marker "${targets[i]}")
+ done
+ write_list_start "Available vi implementations:"
+ write_numbered_list -m "(none found)" "${targets[@]}"
+}
+
+### set action ###
+
+describe_set() {
+ echo "Set a new vi implementation provider"
+}
+
+describe_set_options() {
+ echo "target : Target name or number (from 'list' action)"
+}
+
+describe_set_parameters() {
+ echo "<target>"
+}
+
+do_set() {
+ if [[ -z "${1}" ]] ; then
+ die -q "You didn't give me a provider name"
+
+ elif [[ -n "${2}" ]] ; then
+ die -q "Too many parameters"
+
+ elif [[ -L "${EROOT}/usr/bin/vi" ]] ; then
+ if ! remove_symlinks ; then
+ die -q "Can't remove existing provider"
+ elif ! set_symlinks "${1}" ; then
+ die -q "Can't set new provider"
+ fi
+
+ elif [[ -e "${EROOT}/usr/bin/vi" ]] ; then
+ die -q "Sorry, ${EROOT}/usr/bin/vi confuses me"
+
+ else
+ set_symlinks "${1}" || die -q "Can't set a new provider"
+ fi
+}
+
+### update action ###
+
+describe_update() {
+ echo "Automatically update the vi provider"
+}
+
+describe_update_options() {
+ echo "--if-unset : Do not override existing implementation"
+}
+
+do_update() {
+ [[ -z "${1}" ]] || ( [[ -z "${2}" ]] && [[ "${1}" == "--if-unset" ]] ) || \
+ die -q "Usage error"
+
+ if [[ -L "${EROOT}/usr/bin/vi" ]]; then
+ [[ ${1} == "--if-unset" ]] && return
+ remove_symlinks || die -q "Can't remove existing link"
+ fi
+ if [[ -e "${EROOT}/usr/bin/vi" ]]; then
+ die -q "Can't set a new provider"
+ elif ! [[ -z $(find_targets ) ]]; then
+ set_symlinks 1 || die -q "Can't set a new provider"
+ fi
+}