4

vim を補完する小さな bash 関数を書きました。機能は次のとおりです。

# completion for vim
_vim()
{
    local cur prev

    COMPREPLY=()
    _get_comp_words_by_ref cur prev

    case $prev in
        -h|--help|-v|--version)
            return 0
            ;;
    esac

    if [[ "$cur" == -* ]] ; then
        local _vopts='-v -e -E -s -d -y -R -Z -m -M -b -l -C'
        _vopts="${_vopts} -N -V -D -n -r -r -L -A -H -F -T -u"
        _vopts="${_vopts} --noplugin -p -o -O --cmd -c -S -s -w -W"
        _vopts="${_vopts} -x -X --remote --remote-silent --remote-wait"
        _vopts="${_vopts} --remote-wait-silent --remote-tab --remote-send"
        _vopts="${_vopts} --remote-expr --serverlist --servername"
        _vopts="${_vopts} --startuptime -i -h --help --version"
        COMPREPLY=( $( compgen -W "${_vopts}" \
            -- "$cur" ) )
        return 0
    fi

    local _VIM_IGNORE=".pdf:.dvi:.jpg:.pyc:.exe:.tar:.zip:.ps"
    FIGNORE="${_VIM_IGNORE}" _filedir
} &&
complete -F _vim vim vi v gv vd

_VIM_IGNORE 変数を定義し、FIGNORE をそれに設定することで、拡張子 pdf、dvi などのファイルを無視しようとしましたが、機能しません。

これを達成する方法はありますか?

ありがとう。

4

2 に答える 2

3

I haven't found any documentation, but based on my experiments, it seems that FIGNORE does not affect the compgen() / _filedir() (which is just a wrapper around the former) processing itself. It only affects completions when it is set in the shell from which the completion is triggered (but then globally, which is not what you want).

I guess you cannot use FIGNORE in this clever way, and have to explicitly implement a filter of the COMPREPLY array yourself.

于 2012-11-12T14:30:01.093 に答える
1

Ingo の提案のおかげで、これが私が持っている解決策です。

function _vim()
{
  local cur prev idx ext

  COMPREPLY=()
  _get_comp_words_by_ref cur prev

  case $prev in
    -h|--help|-v|--version)
      return 0
      ;;
  esac

  if [[ "$cur" == -* ]] ; then
    local _vopts='-v -e -E -s -d -y -R -Z -m -M -b -l -C'
    _vopts="${_vopts} -N -V -D -n -r -r -L -A -H -F -T -u"
    _vopts="${_vopts} --noplugin -p -o -O --cmd -c -S -s -w -W"
    _vopts="${_vopts} -x -X --remote --remote-silent --remote-wait"
    _vopts="${_vopts} --remote-wait-silent --remote-tab --remote-send"
    _vopts="${_vopts} --remote-expr --serverlist --servername"
    _vopts="${_vopts} --startuptime -i -h --help --version"
    COMPREPLY=( $( compgen -W "${_vopts}" \
      -- "$cur" ) )
    return 0
  fi

  local _VIM_IGNORE=(pdf xdvi jpg pyc exe tar zip ps)
  _filedir
  for idx in ${!COMPREPLY[@]}; do
    ext=${COMPREPLY[$idx]}
    ext=${ext##*.}
    for iext in ${_VIM_IGNORE[@]}; do
      if test "$ext" = "$iext"; then
        unset -v COMPREPLY[$idx]
        break
      fi
    done
  done
  return 0
}

ファイルが無視された拡張子のいずれかで終わっている場合、それは配列から削除されます。

于 2012-12-04T02:11:06.140 に答える