Автодополнение слов из буфера терминала

Автодополнение слов из буфера терминала

В таких редакторах, как vimи emacs, можно использовать горячие клавиши, такие как C-p(vim) или M-/(emacs), для выполнения автодополнения текущего слова с использованием других слов в том же буфере.

Можно ли добиться той же функциональности в оболочке? Если я вижу какое-то слово в выводе предыдущей команды и хочу быстро автоматически его дополнить при вводе другой команды.

Для ясности приведу пример:

$ ls
Desktop/  Mail/  music/  osx@  something_with_a_pretty_long_name

$ someth

Здесь я хотел бы иметь возможность нажать горячую клавишу и автоматически завершить то, что я печатаю something_with_a_pretty_long_name.

EDIT: Черт. Использование имени файла было плохим примером для того, что я искал. Рассмотрим следующий, второй пример:

$ cat /var/log/something.log
[19:30] Service started
[19:35] Something else happened

$ happ

Где я мог автоматически дополнить 'happ' до 'happened' просто потому, что оно появилось в моем буфере терминала. Надеюсь, это прояснит, что я ищу.

решение1

Короткий ответ: Нет, не в классических оболочках, таких как zshили , bashпоскольку обычно ваша оболочка и терминал являются разными сущностями.

Длинный ответ: Может быть. Обычно происходит следующее: вы вводите команду и нажимаете Enter— теперь ваша оболочкавилкии выполняет указанную команду. Затем оболочка имеетнетНе понимаю, что происходит: оболочка не знает, что будет записано в терминал или что сделала запущенная программа, запустила ли она другие программы, записала ли она что-либо в ваш терминал или что-то еще.

Есть два возможных решения вашей проблемы:

  1. Собирайте все выходные данные выполненных команд и используйте их каким-либо образом для завершения (это можно сделать, но, вероятно, не следует)
  2. Используйте другой терминал, поддерживающий«завершение»из вашего «буфера оболочки».

Решение для 2, например, использование emacs и multi-termпросто использование M- /как вы обычно делаете для завершения вещей из терминала. Другие терминалы могут предлагать похожее решение.

Но действительно ли вам нужно такое завершение? В настоящее время завершение оболочки может завершать страницы руководства, команды, pid, сокеты, параметры команд, пути к файлам из удаленных систем и многое другое. Этого может быть уже достаточно для вашего варианта использования или может быть улучшено для вашей конкретной проблемы.

решение2

http://www.iterm2.com/#/section/features/autocomplete

iterm2 имеет именно то, что вам нужно. Плохо, что он для Mac.

Но поскольку это терминал, вы можете подключиться по ssh к Linux/Unix, и он все равно будет работать.

решение3

Вы можете сделать это с помощьюэкстракткоторый использует tmux для захвата выходных данных и позволяет вам выполнять нечеткую выборку с помощью fzf:

экстракт

решение4

Это, возможно, не тот ответ, который вы ожидаете, но он может удовлетворить некоторые ваши потребности.

Вы можете использовать клавишу TAB для автоматического завершения команды, которая находится в $PATH (или внутренних команд), поэтому, если имя вашего файла является исполняемым файлом и он находится в $PATH, он будет автоматически завершен.

Если вы хотите автодополнить имя файла, который не является исполняемым, вы можете ввести " ." -точка, затем пробел (или что-то вместо точки), затем часть имени файла и TAB. Таким образом вы обманете оболочку, заставив ее поверить, что вы выполняете команду и указываете имя файла в качестве аргумента команды. Нажатие TAB автоматически дополнит имя файла, но вам, возможно, придется удалить точку+пробел перед ней.

Другая возможность — использоватьФункция завершения BASH. Это может автоматически заполнять не только имена файлов.

Связанный контент