web-dev-qa-db-ja.com

Shift-kを押して、Bashでコマンドのマニュアルを開くことは可能ですか?

Vimではヒットすることができます Shift-k カーソルの下にある文字列のマニュアルを開きます。

この方法でBashを構成することもできますか(set -o viを使用する場合)?

例えば:

# '|' represents the position of a cursor.
$ |
# Write a command.
$ grep things *|
# Hit 'esc' to enter normal mode.
# Hit '3b' to move to 'grep'.
$ |grep things *
# Now I would like to hit 'Shift-k' to open 'man grep'.
4

bind -x を使用してbash関数をキーにバインドできます。この関数では、変数 READLINE_LINE および READLINE_POINT を介して入力バッファーの現在の内容にアクセスできます。

run_man () {
  declare prefix="${READLINE_LINE:0:$READLINE_POINT}" suffix="${READLINE_LINE:$READLINE_POINT}"
  declare Word="${prefix##*[!-+.0-9A-Z_a-z]}${suffix%%[!-+.0-9A-Z_a-z]*}"
  man "$Word"
}
bind -m vi -x '"K": run_man'

カーソルの下のWordよりもコマンド位置にあるWordのマニュアルページを開く方が便利な場合がありますが、これにはより複雑な解析が必要です。 bash-completionコードがその助けになるかもしれません。または、行の最初のWordを選択することもできます。これにより、現在のWordを取得するよりも解析が少なくて済みます。

Bashビルトインを検出し、manページの代わりにbashドキュメントを表示するには、 ユニバーサルヘルプ/ manコマンド:helpビルトイン部分一致 を参照してください。

P.S.

プロンプトからコマンド全体を削除せずに男性を見ることができるのは素晴らしいことです。

これはzshで頻繁に行います 。 bashでも可能だと思いますが、設定はもっと複雑です。

history Expansion を使用して、最後に指定したコマンドのコマンド名を参照します。

$ grep something
$ man !:0

履歴の展開はbeforeエイリアスの展開で行われるため、エイリアスを使用する場合は、次のようにする必要があります。

alias k='man "$(history -p \!:0)"'

次に、kと入力して、最後に実行されたコマンドのマニュアルページを確認します。

1
Wildcard

tl; dr

これは標準的な操作ではありませんが、かなり簡単に追加できます。 この回答(リンク) を参照してください。

あなたがまだソースコードをハックする気があるなら...

readlineのソースコード を読みましたが、必要な機能を追加することはかなり実行可能のようです。 readlineはすでにvオプションをサポートしており、編集モードに入り、$EDITORを開くことができます。 readline$EDITORを開く方法のロジックを分析すると、カーソルの下にあるWordを引数としてmanを開くのは非常に簡単です。

ここにいくつかの興味深いgrepsがあります:

  • grep -RI EDITOR *

    doc/hsuser.texi:is used: @code{$@{FCEDIT:-$@{EDITOR:-vi@}@}}.  This says to use the
    doc/hsuser.texi:@env{EDITOR} variable if that is set, or @code{vi} if neither is set.
    doc/rluser.texi:@code{$VISUAL}, @code{$EDITOR}, and @code{emacs}
    examples/rlfe/ChangeLog:    * line options; use EDITOR/VISUAL to set vi/emacs preference.
    examples/rlfe/README:but if the the environment variable EDITOR is set to "vi" that
    examples/rlfe/rlfe.c: * line options; use EDITOR/VISUAL to set vi/emacs preference.
    examples/rlfe/rlfe.c:      if (getenv ("EDITOR") != 0)
    examples/rlfe/rlfe.c:   vi |= strcmp (getenv ("EDITOR"), "vi") == 0;
    
  • grep -RI -C 5 editing-mode *.c

    bind.c-  { "bell-style",        V_STRING,       sv_bell_style },
    bind.c-  { "comment-begin",     V_STRING,       sv_combegin },
    bind.c-  { "completion-display-width", V_INT,   sv_compwidth },
    bind.c-  { "completion-prefix-display-length", V_INT,   sv_dispprefix },
    bind.c-  { "completion-query-items", V_INT,     sv_compquery },
    bind.c:  { "editing-mode",      V_STRING,       sv_editmode },
    bind.c-  { "emacs-mode-string", V_STRING,       sv_emacs_modestr },  
    bind.c-  { "history-size",      V_INT,          sv_histsize },
    bind.c-  { "isearch-terminators", V_STRING,     sv_isrchterm },
    bind.c-  { "keymap",            V_STRING,       sv_keymap },
    bind.c-  { "keyseq-timeout",    V_INT,          sv_seqtimeout },
    --
    --
    bind.c-  else if (_rl_stricmp (name, "completion-query-items") == 0)
    bind.c-    {
    bind.c-      sprintf (numbuf, "%d", rl_completion_query_items);
    bind.c-      return (numbuf);
    bind.c-    }
    bind.c:  else if (_rl_stricmp (name, "editing-mode") == 0)
    bind.c-    return (rl_get_keymap_name_from_edit_mode ());
    bind.c-  else if (_rl_stricmp (name, "history-size") == 0)
    bind.c-    {
    bind.c-      sprintf (numbuf, "%d", history_is_stifled() ? history_max_entries : 0);
    bind.c-      return (numbuf);
    --
    --
    funmap.c-  { "do-lowercase-version", rl_do_lowercase_version },
    funmap.c-  { "downcase-Word", rl_downcase_Word },
    funmap.c-  { "dump-functions", rl_dump_functions },
    funmap.c-  { "dump-macros", rl_dump_macros },
    funmap.c-  { "dump-variables", rl_dump_variables },
    funmap.c:  { "emacs-editing-mode", rl_emacs_editing_mode },
    funmap.c-  { "end-kbd-macro", rl_end_kbd_macro },
    funmap.c-  { "end-of-history", rl_end_of_history },
    funmap.c-  { "end-of-line", rl_end_of_line },
    funmap.c-  { "exchange-point-and-mark", rl_exchange_point_and_mark },
    funmap.c-  { "forward-backward-delete-char", rl_rubout_or_delete },
    --
    --
    funmap.c-  { "vi-column", rl_vi_column },
    funmap.c-  { "vi-complete", rl_vi_complete },
    funmap.c-  { "vi-delete", rl_vi_delete },
    funmap.c-  { "vi-delete-to", rl_vi_delete_to },
    funmap.c-  { "vi-eWord", rl_vi_eWord },
    funmap.c:  { "vi-editing-mode", rl_vi_editing_mode },
    funmap.c-  { "vi-end-bigword", rl_vi_eWord },
    funmap.c-  { "vi-end-Word", rl_vi_end_Word },
    funmap.c-  { "vi-eof-maybe", rl_vi_eof_maybe },
    funmap.c-  { "vi-eword", rl_vi_eword },
    funmap.c-  { "vi-fWord", rl_vi_fWord },
    
0