VIM(BashまたはTmux)のように画面上の単語の補完


10

画面で最後に一致する識別子を完了するようにBash、Zsh、またはTmuxを構成するにはどうすればよいですか?次の一般的なシナリオを検討してください。

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

issue547CLIでBash / Zsh / Tmuxを簡単に完了するにはどうすればよいですか?Git が問題なく完了したTab後にを押すと、数字を自分で完成させる必要があります。なぜなら、前のすべての数字は実際には既存のGitブランチと一致するからです。$ git checkout isissue

VIMでは、omn​​icompleteのCtrl+ Pを押すと、前の一致と同じように完了するため、この場合issue547314は実際に完了します。この動作をBash、Zsh、またはTmuxで取得するにはどうすればよいですか?

私は現在、Ubuntuサーバー(通常12.04 LTS)でBash 4.2とTmux 1.10を使用しています。必要に応じて、最新のUbuntu Server LTS(14.04)に更新できます。

編集:使用が難しくない限り、Bash、Zsh、またはTmuxを使用するソリューションは問題ありません。だから、TabまたはCtrl+ Pまたはいくつかの他のそのようなショートカットは罰金ではなくなりますAlt+ Meta+ Super+ Shift+ א


これにはbashソースのかなり大きなリビジョンが必要であることを確信しています。
ケビン

@Kevin:私も同じくらい考えましたが、うまくいけば、驚くべきzshで処理できるか、おそらくtmuxでも処理できます。
dotancohen 2014年

回答:


4

OPが求めている機能は、Emacsの世界ではdabbrev-expandと呼ばれています。

バッファ内でその略語で始まる単語を検索することにより、動的略語としてポイントの前のバッファ内の単語を展開します(v-expand)。

xtermにもdabbrev-expand機能がありますが、Emacsの対応物よりも少しスマートですが、それは私にとって非常に便利であり、私がに切り替えた理由の1つでしたxtermxtermウィンドウ内では、で指定されたカスタムキーバインドを使用して、特定の文字列~/.Xresourcesを呼び出すことができdabbrev-expandます。たとえば、私の中に次のエントリがあります~/.Xresources(私uxtermはxtermのUnicodeバージョンであるを使用しています)。

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

xtermウィンドウ内でM-/ALT + /)を使用して呼び出すことができますdabbrev-expandxterm入力した文字で始まる画面に表示されているすべての文字列を検索します。例:

$ echo a_very_long_string bye by
$ a_v

M-/今押すxtermと拡大a_vしてしまいa_very_long_stringます。残念ながら、私が言ったxtermようにそれほどスマートではなく、そのdabbrev-expand機能は完全な文字列でのみ機能します。だから、あなたの場合にisまで拡大されるだろうissue540といないissue547314ためissue547314の一部であるorigin/issue547314(とそれについて考える\bほとんどの正規表現エンジンは両方の出現キャッチでしょうが、それは少し似ています、正規表現でissueの文字列を\bissue.+\b)。しかし、タイプorしてからプレスすることができますM-/xterm最初にに展開さorれますがorigin/v2.1、これは必要なものではないため、M-/もう一度押すとxtermに展開されorigin/issue547314ます。これで、Bashを使用するとM-b、次のことができます。C-wと部分C-eを削除しorigin/ます。要約すると、dabbrev-expandinside xtermはEmacs(およびVimの推測)ほど優れていませんが、長い文字列を手動で書き換えるよりも高速で、タイプミスが少なくなります。そして、ほとんどの場合、冗長な部分を削除する必要なく、目的の文字列に直接拡張されます。あなたはそれに慣れる必要があります-カーソルに置きたい文字列を見て、それが他に先行していないかどうか、そしてそれが前の部分を入力しているかどうかを確認し、展開後に削除します。

xtermdabbrev-expandデフォルトでは機能付きでコンパイルされないため、明示的に有効にする必要があることに注意してください。ただし、xtermUbuntuリポジトリののバージョンはでコンパイルされてdabbrev-expandおり、すぐに使用できます。


Arkadiuszさん、ありがとうございます。これは私が必要としているものに十分に近いようです。動作しないことに注意してください!たぶん、私xtermuxtermdabbrev-expand用にコンパイルされていないので、で機能の説明を見つけることができませんでした-help。コンパイルフラグを確認するにはどうすればよいvim --versionですか(など)。私もに設定行をしようとしたことを注記~/.XresourcesとしてMeta <KeyPress> /: dabbrev-expand() \n\ として発見され、ここでどちらかが、助けにはならなかったという。
dotancohen 2014

xtermがdabbrev-expandなしでコンパイルされている可能性があります。xtermをどのようにインストールしましたか?〜/ .Xresourcesを変更した後xrdb -merge .Xresources、xtermで行います。
Arkadiusz Drabczyk 2014

それは間違いなくそれでした、アルカディウス!ありがとうございました!
dotancohen 2014

賞金期間が終了するまであと数時間質問をしますが、あなたが靴をはめていると確信しています。唯一の問題は、xtermの要件です。これはひどいです。しかし、私は機能の適切な名前を知ったので、他のアプリケーションのためにそれをグーグルできます。ありがとう!
dotancohen 2014

アルカディウスに感謝します!私はxtermソリューションを使用しませんが、あなたは確かに私を正しい方向に向けました。確かにzshこの機能があります。
dotancohen 2014

1

バッシュ補完と呼ばれる同様の機能としてのバッシュ。Tabコマンドを入力するときにコマンドに引数を提供するときにキーを押すことで、それを利用できます。

最初に入力lsしてからTab2回押すと、Bashで、使用しようとしているコマンドに一致するファイル(およびコマンドラインスイッチ)のリストが表示されます。

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

そして、これがスイッチの例です:

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

セットアップ?

私のインストールにはすでに次のルールが含まれていますgit

/etc/bash_completion.d/git

このファイルのインストールは、gitパッケージをインストールしたときに行われました。私はFedora 19を使用していますが、他のディストリビューションでもこれを行う必要があります。

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

ルールファイルを見ると、次の状況でオートコンプリートが容易になることが説明されています。

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

だから、これはあなたのために「うまくいく」はずです。


2
バッシュ補完とGit補完作業(OPで言及したとおり)。私が実行したい変更は、最初のタブで完了するようにして、画面に表示されている最後の有効な値を押します。これがVIM Omnicompletionの仕組みです。
dotancohen

@dotancohen-私が今説明した以上にそれが可能になるとは思いません。
slm

1

あなたはextraktoでこのようなことをすることができます:

  • tmux prefix + tabを押して、extraktoを開始します
  • あいまい検索テキスト/パス/ URL
  • 押す
    • tab 現在のペインに挿入するには、
    • enter クリップボードにコピーするには、
    • ctrl-o パス/ URLを開く、または
    • ctrl-e で編集する $EDITOR
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.