男性はニックネームを無視する

男性はニックネームを無視する

nvimBashには(入力時に実行される)エイリアスがありますvim。しかし、私がこれを入力したときにman vim私が受け取る人はvim、いいえですnvim。言葉になりますが、もちろん私が本当に欲しいのは、「使用しないプログラムのマニュアル」ではなく、「シェルやスクリプトでvimを実行したときに手に入れるマニュアル」です。エイリアスや man をこのように動作するように設定する方法はありますか?または、正しいアプリケーションの正しいバージョンに関する情報を探していることを確認するために、manを実行するたびにエイリアスを覚えて/照会したいですか?

答え1

いいえ、man実際にすべてのエイリアスを見つけて、エイリアスを指定したプログラムのマンページを提供する方法はありません。マンページに別のエイリアスを設定するだけです。

alias manvim="man nvim"  

答え2

Bashでは、プロンプトに入力したときに何が起こるのかをtype vim判断するために使用できます。したがって、引数を確認して「正しい操作を実行する」シェル関数でvimそれを置き換えることができます。man

932% type ls
ls is hashed (/bin/ls)
933% type vim
vim is aliased to `nvim'

ご覧のとおり、出力にはtypeいくつかの解析と大文字と小文字の依存関係が必要ですが、単純な場合は確かに大きな問題ではありません。エイリアス拡張には複数の単語(Iエイリアスlftoなど)を含めることができますが、ls -AFこれも処理が簡単です。

エイリアスがパイプの場合は難しくなります(おそらく最初のコマンドのマンページを表示し、最良の結果を願っています)。コマンドがエイリアスではなくシェル関数であれば、絶望的です。そのため、エイリアスを解凍し、変更manなしで他のすべてのコンテンツを渡します。以下は概念証明です(1つのパラメータのみをサポートし、オプションはサポートしていませんman)。

function man {
    # Find out if the command is an alias, an executable, etc.
    local cmd

    p=$(type $1)
    case `set $p; echo $3` in
       aliased) cmd=($(set `command alias $1`; echo $2 | sed "s/.*='\([^ ]*\).*/\1/"));;

       *) cmd=$1;;
    esac

    command man $cmd
}

man vimこれを定義し、エイリアスを見つけて、必要に応じてマンページを表示しますnvim

答え3

シェルがエイリアスをこのように扱う場合:

$ type vim
vim is aliased to `nvim'
$ type -t vim
alias

それではこれを試してみてください。次のシェル関数は、引数が別名かどうかを確認します。その場合は、スペースで区切られた別名の最初の単語を抽出してman実行します。

man() {
  cmd="$1"
  if [ "$(type -t "$cmd")" == "alias" ]
  then cmd=$(type "$cmd" | sed -e 's/.*`//' -e "s/[ '].*//")
  fi
  command man $cmd
}

より包括的なソリューションは、$IFSスペースを見つけるよりもマージし、およびを含む`エイリアスを可能にします'

答え4

これは悪い考えです。 alias コマンドを見つけることも、見つからない場合もあるシェル関数を使用できます。逆に、私はほとんど常に物事の基本名をオーバーライドしません。特に、コマンドがまったく異なるものを実行するようにしないことがよくあります。踏みつけの熊手が多すぎます。この警告を念頭に置いて、ZSHでは、関数は次のようになります。

# test aliases, for testing
# simple no args
alias emacs=ls
# with flags; need to pick first word and hope that's a command...
alias nano='ls -al'
# and oops there's also the ENV prefix form...
alias notepad='ASDF=blah ls -F'
# and also be sure to test with something-that-is-not-an-alias ...

# TODO call this `man` to actually override the man
function crazyman {
  local -a cmd args

  # one may simply type `man ... foo` or there could also be multiple
  # man pages to be viewed `man ... foo bar` so must iterate over all
  # the hopefully-not-options-or-section-names arguments and try alias
  # lookups and all such... `man ls -w` may also be legal depending on
  # the getops, by the way.
  while :; do
    if [[ -n $1 ]]; then
      while :; do
        # try to skip over `man 1 foo` or `man -w foo` forms to find what
        # is hopefully the foo command
        #
        # TODO 'n' section for TCL complicated as there could also be a
        # 'man n' command alongside "man n expr" or whatnot; this assumes
        # there is no 'man n' page that would ever be looked up. Other
        # non-numeric-prefixed man section names may also need to be
        # handled here, depending on the vendor...
        if [[ $1 =~ "^[0-9-]|^n$" ]]; then
          args+=($1)
          shift
        else
          break
        fi
      done

      cmd=(${(z)aliases[$1]})

      if (( #cmd )); then
        # aliases might be simple foo='bar ...' or more complicated
        # foo='ENV=asdf ... bar ...' where we need to dig to try to find
        # the bar command, and perhaps other complications as well :/
        # I did say this was a bad idea...
        while :; do
          if [[ $cmd[1] =~ "=" ]]; then
            shift cmd
          else
            break
          fi
        done
        args+=($cmd[1])
      else
        args+=($1)
      fi
      shift
    else
      break
    fi
  done

  command man $args
}

command man $argsこれを手動テストに置き換えますprint -l command man $args(上記のコードの極端なケース数が与えられた場合は、適切なユニットテストをお勧めします)。

% crazyman emacs
command
man
ls
% crazyman nano 
command
man
ls
% crazyman notepad
command
man
ls
% crazyman notepad nano
command
man
ls
ls
% crazyman nosuchalias
command
man
nosuchalias
% 

このコードを別のシェルに移植することは、読者の練習問題として残ります。または、このコードを単純化して使用しないでください。複雑になると大きな利点は得られません。

関連情報