В таких редакторах, как 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— теперь ваша оболочкавилкии выполняет указанную команду. Затем оболочка имеетнетНе понимаю, что происходит: оболочка не знает, что будет записано в терминал или что сделала запущенная программа, запустила ли она другие программы, записала ли она что-либо в ваш терминал или что-то еще.
Есть два возможных решения вашей проблемы:
- Собирайте все выходные данные выполненных команд и используйте их каким-либо образом для завершения (это можно сделать, но, вероятно, не следует)
- Используйте другой терминал, поддерживающий«завершение»из вашего «буфера оболочки».
Решение для 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. Это может автоматически заполнять не только имена файлов.