web-dev-qa-db-ja.com

プログラムでコマンドのアクションを取得する

gitの例を見てみましょう。

$ git<TAB><TAB>
git                 git-import-dscs     git-Shell
git-buildpackage    git-import-orig     git-upload-archive
git-dch             git-pbuilder        git-upload-pack
git-import-dsc      git-receive-pack    

gitの後に注意してください。

$ git <tab><tab>
add                 fetch               Push 
am                  filter-branch       rebase 
annotate            format-patch        reflog 
apply               fsck                relink 
archive             gc                  remote 
bisect              get-tar-commit-id   repack 
blame               grep                replace 
branch              help                request-pull 
buildpackage        imap-send           reset 
bundle              import-dsc          revert 
checkout            import-dscs         rm 
cherry              import-orig         shortlog 
cherry-pick         init                show 
clean               instaweb            show-branch 
clone               log                 stage 
column              merge               stash 
commit              mergetool           status 
config              mv                  submodule 
credential          name-rev            subtree 
--More--

書くgit re

$ git re<tab><tab>
rebase         relink         repack         request-pull   revert 
reflog         remote         replace        reset          

$ git remote <tab><tab>
add            remove         set-branches   set-url        update 
Prune          rename         set-head       show           

一般的に:

$ command <tab> 
[actions]

これらのアクションをプログラムで取得するにはどうすればよいですか?これはシェル/ bashスクリプトを介して可能ですか?

5
Ionică Bizău

この機能は、BashCompletionと呼ばれるものによって実行されています。これをバックアップするファイルは/etc/bash_completion.dの下に保存され、各コマンドには独自のファイルがあります。したがって、gitの場合:

/etc/bash_completion.d/git

このファイルを見ると、追加の機能で環境が過負荷になっていることがわかります。特に1つはこの男です:

$ __git_commands

実行すると、サブコマンドのリストが表示されます。

$ __git_commands | head -5
  add                       merge-recursive
  add--interactive          merge-resolve
  am                        merge-subtree
  annotate                  merge-tree
  apply                     mergetool

これらが環境内の単なる機能であることを知っていると、次のことができます。

$ __git<tab><tab>
__git_aliased_command                __git_complete_remote_or_refspec     __git_diff_index_files               __git_index_files                    __git_refs
__git_aliases                        __git_complete_revlist               __git_diff_index_helper              __gitk_main                          __git_refs2
__git_commands                       __git_complete_revlist_file          __gitdir                             __git_list_all_commands              __git_refs_remotes
__gitcomp                            __git_complete_strategy              __git_find_on_cmdline                __git_list_merge_strategies          __git_remotes
__gitcompadd                         __gitcomp_nl                         __git_func_wrap                      __git_list_porcelain_commands        __git_tags
__gitcomp_file                       __git_compute_all_commands           __git_has_doubledash                 __git_ls_files_helper                __git_wrap__gitk_main
__git_complete                       __git_compute_merge_strategies       __git_heads                          __git_main                           __git_wrap__git_main
__git_complete_diff_index_file       __git_compute_porcelain_commands     __git_index_file_list_filter         __git_match_ctag                     
__git_complete_file                  __git_config_get_set_variables       __git_index_file_list_filter_bash    __git_pretty_aliases                 
__git_complete_index_file            __git_count_arguments                __git_index_file_list_filter_compat  __git_reassemble_comp_words_by_ref   

gitコマンドに関するさまざまな情報を提供するすべてのBashCompletion関数のリストを取得します。

7
slm

ここで見ているものは プログラム可能な完了 と呼ばれます。 Debian/Ubuntuベースのシステムでは、パッケージは多くの場合、コマンドのプログラム可能な完了を提供するファイルを/usr/share/bash-completion/completionsにインストールします。他のディストリビューションでは、/etc/bash_completion.dディレクトリが使用される場合があります(この場所はDebian/Ubuntuでは非推奨ですが、一部のパッケージでは引き続き使用されます)。私にとって、gitの補完を生成する関数を含むファイルは/usr/share/bash-completion/completions/です。

基本的なプロセスは、COMPREPLYシェル配列のコンテンツを生成する関数が定義され、これらがcompleteシェル組み込みを使用して特定のコマンドに登録されることです。

完了の動作方法を変更する場合は、これらのファイルを直接変更するのではなく、システムの更新によって変更が無効になる可能性があるため、必要な関数の新しいバージョンをユーザー固有の場所(.bashrcなど)に作成することをお勧めします。ホームディレクトリ。

2
Graeme