| # Copyright 1999-2017 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| # @ECLASS: vim-plugin.eclass |
| # @MAINTAINER: |
| # vim@gentoo.org |
| # @BLURB: used for installing vim plugins |
| # @DESCRIPTION: |
| # This eclass simplifies installation of app-vim plugins into |
| # /usr/share/vim/vimfiles. This is a version-independent directory |
| # which is read automatically by vim. The only exception is |
| # documentation, for which we make a special case via vim-doc.eclass. |
| |
| inherit estack vim-doc |
| EXPORT_FUNCTIONS src_install pkg_postinst pkg_postrm |
| |
| VIM_PLUGIN_VIM_VERSION="${VIM_PLUGIN_VIM_VERSION:-7.3}" |
| |
| DEPEND="|| ( >=app-editors/vim-${VIM_PLUGIN_VIM_VERSION} |
| >=app-editors/gvim-${VIM_PLUGIN_VIM_VERSION} )" |
| RDEPEND="${DEPEND}" |
| if [[ ${PV} != 9999* ]] ; then |
| SRC_URI="mirror://gentoo/${P}.tar.bz2 |
| https://dev.gentoo.org/~radhermit/vim/${P}.tar.bz2" |
| fi |
| SLOT="0" |
| |
| # @FUNCTION: vim-plugin_src_install |
| # @DESCRIPTION: |
| # Overrides the default src_install phase. In order, this function: |
| # * fixes file permission across all files in ${S}. |
| # * installs help and documentation files. |
| # * installs all files in "${ED}"/usr/share/vim/vimfiles. |
| vim-plugin_src_install() { |
| has "${EAPI:-0}" 0 1 2 && ! use prefix && ED="${D}" |
| local f |
| |
| # When globbing, if nothing exists, the shell literally returns the glob |
| # pattern. So turn on nullglob and extglob options to avoid this. |
| eshopts_push -s extglob |
| eshopts_push -s nullglob |
| |
| ebegin "Cleaning up unwanted files and directories" |
| # We're looking for dotfiles, dotdirectories and Makefiles here. |
| local obj |
| eval "local matches=(@(.[^.]|.??*|Makefile*))" |
| for obj in "${matches[@]}"; do |
| rm -rv "${obj}" || die "cannot remove ${obj}" |
| done |
| eend $? |
| |
| # Turn those options back off. |
| eshopts_pop |
| eshopts_pop |
| |
| # Install non-vim-help-docs |
| cd "${S}" || die "couldn't cd in ${S}" |
| local f |
| for f in *; do |
| [[ -f "${f}" ]] || continue |
| if [[ "${f}" = *.html ]]; then |
| dohtml "${f}" |
| else |
| dodoc "${f}" |
| fi |
| rm "${f}" || die |
| done |
| |
| # Install remainder of plugin |
| cd "${WORKDIR}" || die "couldn't cd in ${WORKDIR}" |
| dodir /usr/share/vim |
| mv "${S}" "${ED}"/usr/share/vim/vimfiles || die \ |
| "couldn't move ${S} to ${ED}/usr/share/vim/vimfiles" |
| |
| # Set permissions |
| fperms -R a+rX /usr/share/vim/vimfiles |
| } |
| |
| # @FUNCTION: vim-plugin_pkg_postinst |
| # @DESCRIPTION: |
| # Overrides the pkg_postinst phase for this eclass. |
| # The following functions are called: |
| # * update_vim_helptags |
| # * update_vim_afterscripts |
| # * display_vim_plugin_help |
| vim-plugin_pkg_postinst() { |
| update_vim_helptags # from vim-doc |
| update_vim_afterscripts # see below |
| display_vim_plugin_help # see below |
| } |
| |
| # @FUNCTION: vim-plugin_pkg_postrm |
| # @DESCRIPTION: |
| # Overrides the pkg_postrm phase for this eclass. |
| # This function calls the update_vim_helptags and update_vim_afterscripts |
| # functions and eventually removes a bunch of empty directories. |
| vim-plugin_pkg_postrm() { |
| has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX= |
| update_vim_helptags # from vim-doc |
| update_vim_afterscripts # see below |
| |
| # Remove empty dirs; this allows |
| # /usr/share/vim to be removed if vim-core is unmerged |
| find "${EPREFIX}/usr/share/vim/vimfiles" -depth -type d -exec rmdir {} \; 2>/dev/null || \ |
| die "rmdir failed" |
| } |
| |
| # @FUNCTION: update_vim_afterscripts |
| # @DESCRIPTION: |
| # Creates scripts in /usr/share/vim/vimfiles/after/* |
| # comprised of the snippets in /usr/share/vim/vimfiles/after/*/*.d |
| update_vim_afterscripts() { |
| has "${EAPI:-0}" 0 1 2 && ! use prefix && EROOT="${ROOT}" |
| has "${EAPI:-0}" 0 1 2 && ! use prefix && EPREFIX= |
| local d f afterdir="${EROOT}"/usr/share/vim/vimfiles/after |
| |
| # Nothing to do if the dir isn't there |
| [ -d "${afterdir}" ] || return 0 |
| |
| einfo "Updating scripts in ${EPREFIX}/usr/share/vim/vimfiles/after" |
| find "${afterdir}" -type d -name \*.vim.d | while read d; do |
| echo '" Generated by update_vim_afterscripts' > "${d%.d}" || die |
| find "${d}" -name \*.vim -type f -maxdepth 1 -print0 | sort -z | \ |
| xargs -0 cat >> "${d%.d}" || die "update_vim_afterscripts failed" |
| done |
| |
| einfo "Removing dead scripts in ${EPREFIX}/usr/share/vim/vimfiles/after" |
| find "${afterdir}" -type f -name \*.vim | \ |
| while read f; do |
| [[ "$(head -n 1 ${f})" == '" Generated by update_vim_afterscripts' ]] \ |
| || continue |
| # This is a generated file, but might be abandoned. Check |
| # if there's no corresponding .d directory, or if the |
| # file's effectively empty |
| if [[ ! -d "${f}.d" || -z "$(grep -v '^"' "${f}")" ]]; then |
| rm "${f}" || die |
| fi |
| done |
| } |
| |
| # @FUNCTION: display_vim_plugin_help |
| # @DESCRIPTION: |
| # Displays a message with the plugin's help file if one is available. Uses the |
| # VIM_PLUGIN_HELPFILES env var. If multiple help files are available, they |
| # should be separated by spaces. If no help files are available, but the env |
| # var VIM_PLUGIN_HELPTEXT is set, that is displayed instead. Finally, if we |
| # have nothing else, this functions displays a link to VIM_PLUGIN_HELPURI. An |
| # extra message regarding enabling filetype plugins is displayed if |
| # VIM_PLUGIN_MESSAGES includes the word "filetype". |
| display_vim_plugin_help() { |
| local h |
| |
| if ! has_version ${CATEGORY}/${PN} ; then |
| if [[ -n "${VIM_PLUGIN_HELPFILES}" ]] ; then |
| elog " " |
| elog "This plugin provides documentation via vim's help system. To" |
| elog "view it, use:" |
| for h in ${VIM_PLUGIN_HELPFILES} ; do |
| elog " :help ${h}" |
| done |
| elog " " |
| |
| elif [[ -n "${VIM_PLUGIN_HELPTEXT}" ]] ; then |
| elog " " |
| while read h ; do |
| elog "$h" |
| done <<<"${VIM_PLUGIN_HELPTEXT}" |
| elog " " |
| |
| elif [[ -n "${VIM_PLUGIN_HELPURI}" ]] ; then |
| elog " " |
| elog "Documentation for this plugin is available online at:" |
| elog " ${VIM_PLUGIN_HELPURI}" |
| elog " " |
| fi |
| |
| if has "filetype" "${VIM_PLUGIN_MESSAGES}" ; then |
| elog "This plugin makes use of filetype settings. To enable these," |
| elog "add lines like:" |
| elog " filetype plugin on" |
| elog " filetype indent on" |
| elog "to your ~/.vimrc file." |
| elog " " |
| fi |
| fi |
| } |