Завершение слов на экране как в 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

Как я могу заставить Bash / Zsh / Tmux issue547легко выполнить CLI? Когда я нажимаю Tabпосле того, как $ git checkout isGit завершает работу issue, но я должен завершить цифры самостоятельно, потому что все предыдущие цифры действительно соответствуют существующим ветвям Git .

В VIM нажатие Ctrl+ Pдля omnicomplete завершится, как и предыдущий матч, поэтому в этом случае issue547314фактически будет завершено. Как я могу получить это поведение в Bash, Zsh или Tmux ?

В настоящее время я использую Bash 4.2 и Tmux 1.10 на Ubuntu Server (обычно 12.04 LTS). Я могу обновить до последней версии Ubuntu Server LTS (14.04), если это необходимо.

РЕДАКТИРОВАТЬ : Я не возражаю против любого решения, которое использует Bash, Zsh или Tmux, если его не сложно использовать. Так Tabили Ctrl+ Pили какой - либо другой такой ярлык будет хорошо, но не Alt+ Meta+ Super+ Shift+ א.

dotancohen
источник
Уверен, что для этого потребуется довольно большая версия исходного кода bash.
Кевин
@Kevin: Я так и думал, но, надеюсь, с этим справится либо удивительный zsh, либо, возможно, tmux.
dotancohen

Ответы:

4

Я думаю, что функция, которую ищет OP, в мире Emacs называется dabbrev-expand :

Разверните слово в буфере перед точкой как динамическую аббревиатуру, ища в буфере слова, начинающиеся с этой аббревиатуры (v-expand).

xtermтакже имеет dabbrev-expandфункцию, но она немного менее умна, чем аналог Emacs, но это очень полезно для меня, и одна из причин, по которой я переключился xterm. Внутри xtermокна можно использовать пользовательскую привязку клавиш, указанную в, ~/.Xresourcesдля вызова dabbrev-expandданной строки. Например, у меня есть следующая запись в моем ~/.Xresources(я использую uxtermUnicode-версию xterm):

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

Внутри xtermокна я могу использовать M-/( ALT + /) для вызова dabbrev-expand. xtermбудет искать все строки, видимые на экране, которые начинаются с букв, которые я набрал. Пример:

$ 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-expandвнутренняя часть xtermне так хороша, как в Emacs (и, думаю, Vim), но все же быстрее, чем переписывать длинные строки вручную и менее подвержена опечаткам. И в большинстве случаев он будет расширяться непосредственно до нужной строки без необходимости удалять лишние части. Вам просто нужно к этому привыкнуть - посмотрите на строку, которую вы хотите иметь в курсоре, и посмотрите, не предшествует ли ей что-то еще, и если она набирает предыдущую часть и удалите ее после раскрытия.

Обратите внимание, что по умолчанию функция xtermне компилируется dabbrev-expand, и вы должны включить ее явно. Тем не менее, версия xtermв репозиториях Ubuntu скомпилирована, dabbrev-expandи вы можете использовать ее прямо сейчас.

Аркадиуш Драбчик
источник
Спасибо, Аркадиуш, кажется, это достаточно близко к тому, что мне нужно. Обратите внимание, что я не могу заставить его работать! Возможно, мои xtermи uxtermне скомпилированы для dabbrev-расширить, я не мог найти упоминание о функции в -help. Как я могу увидеть флаги компиляции (как с vim --version)? Обратите внимание, что я также попробовал строку конфигурации, ~/.Xresourcesкак Meta <KeyPress> /: dabbrev-expand() \n\ показано здесь, но это тоже не помогло.
dotancohen
Возможно, ваш xterm был скомпилирован без dabbrev-expand. Как вы установили xterm? После изменения ~ / .Xresources сделайте xrdb -merge .Xresourcesв xterm.
Аркадиуш Драбчик
Это, безусловно, сделал это, Аркадиуш! Спасибо!
dotancohen
Я собираюсь задать вопрос еще несколько часов, пока не закончится период вознаграждения, но я почти уверен, что вы подкованы. Единственная проблема - требование к xterm, что ужасно! Но теперь, когда я знаю правильное название функции, я могу использовать ее для других приложений . Спасибо!
dotancohen
Спасибо, Аркадиуш! Хотя я не буду использовать решение xterm, вы, безусловно, указали мне правильное направление. Очевидно zsh, есть эта возможность.
dotancohen
1

Bash, как похожее средство, называется bash complete. Вы можете использовать его, нажимая Tabклавишу при предоставлении аргументов командам, когда вы их набираете.

пример

Если я начну с того, что наберу, lsа затем нажму Tabдважды, вы получите 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
#

Так что это должно "просто работать" для вас.

SLM
источник
2
Завершение Bash и завершение Git (как я упоминаю в OP). Изменение, которое я хотел бы выполнить, чтобы завершить его на первой вкладке, нажать последнее допустимое значение, отображаемое на экране. Так работает VIM Omnicompletion.
dotancohen
@dotancohen - я не вижу сейчас, что было бы возможно за то, что я описал.
SLM
1

Вы можете сделать что-то подобное с помощью extrakto :

  • нажмите tmux, prefix + tabчтобы запустить extrakto
  • нечеткий найти текст / путь / URL
  • Нажмите
    • tab вставить его в текущую панель,
    • enter скопировать его в буфер обмена,
    • ctrl-o открыть путь / URL или
    • ctrl-e редактировать с $EDITOR
laktak
источник