Uzupełnianie słów na ekranie jak w VIM (Bash lub Tmux)


10

Jak mogę skonfigurować Bash, Zsh lub Tmux, aby uzupełniał ostatni pasujący identyfikator na ekranie ? Rozważ ten typowy scenariusz:

$ 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

Jak mogę łatwo uzyskać Bash / Zsh / Tmux issue547na CLI? Kiedy naciskam Tabpo tym, jak $ git checkout isGit pomaga ukończyć issue, ale muszę uzupełnić cyfry samodzielnie, ponieważ wszystkie poprzednie cyfry faktycznie pasują do istniejących gałęzi Git .

W VIM naciśnięcie Ctrl+ Pdla omnicomplete zakończy się jak w poprzednim meczu, więc w tym przypadku issue547314faktycznie zostanie ukończone. Jak mogę uzyskać takie zachowanie w Bash, Zsh lub Tmux ?

Obecnie używam Bash 4.2 i Tmux 1.10 na Ubuntu Server (zwykle 12.04 LTS). W razie potrzeby mogę zaktualizować do najnowszej wersji Ubuntu Server LTS (14.04).

EDYCJA : Nie miałbym nic przeciwko rozwiązaniu, które używa Bash, Zsh lub Tmux, o ile nie jest trudne w użyciu. Tak Tablub Ctrl+ Plub inny taki skrót byłby w porządku, ale nie Alt+ Meta+ Super+ Shift+ א.


Całkiem pewne, że zajmie to dość dużą wersję źródła bash.
Kevin

@Kevin: Doszedłem do wniosku, ale mam nadzieję, że albo niesamowity zsh sobie z tym poradzi, albo może tmux.
dotancohen

Odpowiedzi:


4

Myślę, że funkcja, której szuka OP, nazywa się dabbrev-expand w świecie Emacsa:

Rozwiń słowo w buforze przed punktem jako dynamiczny skrót, wyszukując w buforze słowa zaczynające się od tego skrótu (v-expand).

xtermma także dabbrev-expandfunkcję, ale jest nieco mniej inteligentny niż odpowiednik Emacsa, ale jest dla mnie bardzo przydatny i jeden z powodów, dla których przerzuciłem się xterm. Wewnątrz xtermokna można użyć niestandardowego przypisania klawiszy określonego w, ~/.Xresourcesaby wywołać dabbrev-expanddany ciąg. Na przykład mam następujący wpis w mojej ~/.Xresources(używam uxterm, xterm w wersji Unicode):

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

Wewnątrz xtermokna mogę użyć M-/( ALT + /) do wywołania dabbrev-expand. xtermwyszuka wszystkie ciągi widoczne na ekranie, które zaczynają się od wpisanych liter. Przykład:

$ echo a_very_long_string bye by
$ a_v

Gdybym nacisnął M-/teraz xterm, rozwinąłbym się a_vdo a_very_long_string. Niestety, jak powiedziałem, xtermnie jest tak inteligentny, a jego dabbrev-expandfunkcja będzie działać tylko na pełnych ciągach. Tak więc w twoim przypadku iszostałby rozwinięty issue540i nie issue547314dlatego, że issue547314jest częścią origin/issue547314(pomyśl o tym, jak \bw wyrażeniach regularnych, jest trochę podobny, chociaż większość silników wyrażeń regularnych przechwytuje oba wystąpienia issueciągów \bissue.+\b). Ale możesz pisać, ora następnie naciskać M-/. xtermnajpierw rozwinie się ordo origin/v2.1, nie tego chcemy, więc naciśnij M-/ponownie i xtermrozwinie się do origin/issue547314. Teraz, jeśli używasz Basha, możesz to zrobić M-b,C-wi C-eusunąć origin/część. Reasumując, dabbrev-expandwnętrze xtermnie jest tak dobre jak w Emacsie (i chyba Vima), ale wciąż jest szybsze niż ręczne pisanie długich ciągów i mniej podatne na literówki. W większości przypadków rozwija się bezpośrednio do pożądanego ciągu bez potrzeby usuwania zbędnych części. Musisz się tylko do tego przyzwyczaić - spójrz na ciąg znaków, który chcesz mieć na kursorze, i zobacz, czy nie jest poprzedzony czymś innym, a jeśli jest to część poprzedzająca i usuń ją po rozwinięciu.

Zauważ, że domyślnie xtermnie jest kompilowana z dabbrev-expandfunkcją i musisz ją wyraźnie włączyć. Jednak wersja xtermrepozytoriów Ubuntu jest kompilowana dabbrev-expandi można z niej korzystać od razu.


Dziękuję Arkadiusz, wydaje się, że jest to wystarczająco blisko tego, czego potrzebuję. Pamiętaj, że nie mogę go uruchomić! Być może moje xtermi uxtermnie są skompilowane dla dabbrev-expand, nie mogłem znaleźć żadnej wzmianki o tej funkcji w -help. Jak mogę zobaczyć flagi kompilacji (jak w przypadku vim --version)? Należy zauważyć, że próbowałem również linię config w ~/.Xresourcestak Meta <KeyPress> /: dabbrev-expand() \n\ jak znaleźć tutaj , ale to nie pomogło, albo.
dotancohen

Być może twój Xterm został skompilowany bez dabbrev-expand. Jak zainstalowałeś Xterm? Po zmodyfikowaniu ~ / .Xresources wykonaj xrdb -merge .Xresourcesw xterm.
Arkadiusz Drabczyk

Z pewnością to zrobiło, Arkadiusz! Dziękuję Ci!
dotancohen

Zadam pytanie jeszcze kilka godzin, zanim skończy się okres nagród, ale jestem prawie pewien, że jesteś zaangażowany. Jedynym problemem jest wymóg Xterm, co jest okropne! Ale teraz, gdy znam właściwą nazwę tej funkcji, mogę google znaleźć w innych aplikacjach . Dzięki!
dotancohen

Dziękuję Arkadiusz! Chociaż nie będę korzystać z rozwiązania xterm, z pewnością wskazałeś mi właściwy kierunek. Wygląda na zshto, że ma tę funkcję.
dotancohen

1

Bash jako podobny obiekt o nazwie uzupełnianie bash. Możesz z niego skorzystać, naciskając Tabklawisz podczas wprowadzania argumentów do poleceń podczas ich wpisywania.

Przykład

Jeśli zacznę od wpisania, lsa następnie Tabdwukrotnego naciśnięcia , Bash dostarczy listę pasujących plików (i przełączników wiersza poleceń) do dowolnego polecenia, którego próbujesz użyć:

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

A oto przykład z przełącznikami:

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

Ustawiać?

Moja instalacja zawierała już regułę dla git:

/etc/bash_completion.d/git

Instalacja tego pliku została wykonana podczas instalacji gitpakietu. Jestem na Fedorze 19, ale inne dystrybucje też powinny to robić.

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

Patrząc na plik reguł, wyjaśnia, że ​​ułatwi automatyczne uzupełnianie w następujących sytuacjach:

# 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
#

To powinno dla ciebie „po prostu działać”.


2
Ukończenie basha i ukończenie Gita (jak wspomniałem w PO). Zmiana, którą chciałbym wykonać, polega na tym, aby wykonać ją na pierwszej karcie i nacisnąć ostatnią legalną wartość pokazaną na ekranie. Tak działa VIM Omnicompletion.
dotancohen

@dotancohen - Nie widzę, że byłoby to możliwe poza tym, co opisałem.
slm

1

Możesz zrobić coś takiego za pomocą extrakto :

  • naciśnij tmux, prefix + tababy rozpocząć ekstrakto
  • rozmyte znaleźć tekst / ścieżkę / adres URL
  • naciśnij
    • tab aby wstawić go do bieżącego panelu,
    • enter aby skopiować go do schowka,
    • ctrl-o aby otworzyć ścieżkę / adres URL lub
    • ctrl-e edytować za pomocą $EDITOR
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.