Завершення слів на екрані, як у 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 заповнити issue547CLI легко? Коли я натискаю Tabпісля того, як $ git checkout isGit допоможе завершити issue, але я повинен заповнити цифри сам, тому що всі попередні цифри насправді відповідають існуючим гітам Git .

У VIM натискання Ctrl+ Pдля всеосяжного завершиться, як і попередній збіг, тому в цьому випадку issue547314фактично буде завершено. Як я можу отримати таку поведінку в Bash, в Zsh або в Tmux ?

На даний момент я використовую Bash 4.2 та Tmux 1.10 на сервері Ubuntu (зазвичай це 12,04 LTS). Я можу оновити до останнього Ubuntu Server LTS (14.04), якщо потрібно.

EDIT : Я не заперечував би проти будь-якого рішення, яке використовує Bash, Zsh або Tmux, доки це не важко використовувати. Так Tabабо Ctrl+ Pабо якась інша така ярлика буде добре, але не Alt+ Meta+ Super+ Shift+ א.


Досить впевнений, що це потребує досить значного перегляду джерела bash.
Кевін

@Kevin: Я подумав стільки, але, сподіваюся, або дивовижний zsh впорається з цим, або, можливо, tmux.
dotancohen

Відповіді:


4

Я думаю, що ця функція, яку шукає ОП, у світі Emacs називається dabbrev-expand :

Розгорніть слово в буфері перед точкою як динамічну абревіатуру, шукаючи в буфері слова, що починаються з цієї абревіатури (v-розширити).

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не складені для даббрев-розширення, я не міг знайти згадки про цю функцію в -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 завершення. Ви можете скористатися ним, натиснувши 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
#

Тому це повинно "просто працювати" для вас.


2
Робота з завершенням Bash та Git (як я згадую в ОП). Зміни, які я хотів би зробити, полягає в тому, щоб воно було завершено на першому натисканні вкладки останнього юридичного значення, відображеному на екрані. Так працює VIM Omnicompletion.
dotancohen

@dotancohen - Я не бачу, що це було б можливо за межами описаного мною.
slm

1

Ви можете зробити щось подібне за допомогою екстракто :

  • натисніть tmux, prefix + tabщоб почати екстра
  • нечітко знайти текст / шлях / URL
  • натиснути
    • tab щоб вставити його в поточну панель,
    • enter скопіювати його у буфер обміну,
    • ctrl-o щоб відкрити шлях / URL або
    • ctrl-e редагувати за допомогою $EDITOR
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.