Вопрос или проблема
Мне нравится копировать вещи из терминала, но я не люблю перемещаться к мыши. Как выбрать текст в Terminal.app с помощью клавиатуры?
Например, находясь в Terminal, может хотеться переместиться к определенной точке на строке и затем выделить часть текста с помощью клавиш со стрелками влево и вправо, которую затем можно будет вырезать или копировать. Это возможно?
Если вы хотите скопировать вывод команды, вы можете использовать pbcopy
. Чтобы получить конкретный вывод, используйте grep
.
Например, чтобы скопировать весь вывод netstat -an
:
netstat -an | pbcopy
Чтобы скопировать только вывод открытых портов (прослушивающих):
netstat -an | grep LISTEN | pbcopy
Сам Terminal.app не имеет способа использовать клавиатуру для выбора текста, но используя терминальный мультиплексор, такой как screen или tmux, вы можете сделать это в режиме “копирования”. Screen установлен по умолчанию в OS X, а tmux можно установить через сторонние инструменты, такие как Homebrew или Macports. В man-странице для обеих программ описан режим копирования и как выбрать текст для копирования в буфер обмена. В man-странице screen можно найти больше информации о навигации в режиме копирования в разделе CUSTOMIZATION
под copy
. Вот выдержка:
copy
Введите режим копирования/прокрутки. Это позволяет вам копировать текст из
текущего окна и его истории в буфер для вставки. В этом режиме активен
редактор, похожий на `full screen editor`:
Клавиши движения:
h, j, k, l перемещают курсор по строкам или столбцам.
0, ^ и $ перемещают к самому левому столбцу, к первому или последнему
небелому символу в строке.
H, M и L перемещают курсор к самому левому столбцу верхней, центрированной
или нижней строки окна.
+ и - перемещают на одну строку вверх и вниз.
G перемещает к указанной абсолютной строке (по умолчанию: конец буфера).
| перемещает к указанному абсолютному столбцу.
w, b, e перемещают курсор слово за словом.
B, E перемещают курсор на WORD за WORD (как в vi).
C-u и C-d прокручивают экран вверх/вниз на указанное количество строк,
сохраняя положение курсора. (По умолчанию: половина экрана).
C-b и C-f прокручивают экран вверх/вниз на полный экран.
g перемещает к началу буфера.
% перескакивает к указанному проценту буфера.
Это все еще не взаимодействует с буфером обмена системы, поэтому вам придется как-то скопировать вывод, возможно, вызвав содержимое буфера вставки в pbcopy. Пример рабочего процесса:
(C-a [ – это “удерживайте control, нажмите A, а затем нажмите [“, то же самое для ]. смотрите man-страницу screen.)
- Запустите screen и работайте там.
- Войдите в режим копирования: C-a [
- Навигируйте, используя привязки клавиш vi (или настройте использование привязок emacs согласно man-странице).
- Начните выделение текста, нажав пробел.
- Нажмите enter, чтобы скопировать выделение в буфер вставки. Это выйдет из режима копирования.
- Вставьте буфер с помощью C-a ]
echo ‘C-a ]’ | pbcopy
(не набирайте C-a ], используйте привязку клавиш, как описано выше, используйте кавычки, где это необходимо)
Выбранный текст должен быть в системном буфере обмена, и вы можете вставить его в другое окно. Например, следующее:
paste [registers [dest_reg]]
Запишите (конкатенированные) содержимое указанных регистров в
очередь stdin текущего окна. Регистры . рассматриваются как буфер вставки.
Если параметр не указан, пользователю предлагается ввести один
регистр для вставки. Буфер вставки может быть заполнен командами
copy, history и readbuf. Другие регистры могут быть заполнены
командами register, readreg и paste. Если paste вызывается с
вторым аргументом, содержимое указанных регистров вставляется в
именованный регистр назначения, а не в окно. Если . используется в качестве
второго аргумента, отображающийся буфер вставки будет являться местом назначения.
Обратите внимание, что "paste" использует широкий спектр ресурсов:
Всякий раз, когда задан второй аргумент, текущее окно не требуется.
Когда спецификация источника содержит только регистры (не буфер вставки),
то текущее отображение (привязанное к терминалу) не требуется, так как регистры
являются глобальным ресурсом. Буфер вставки существует один раз для каждого пользователя.
Это было из ман-страницы screen после выполнения вышеописанного :).
Теперь, учитывая все вышесказанное, и вы действительно упоминаете Terminal.app, новая функция iTerm2 версии 0.20.20101102, которая находится на этапе альфа-тестирования, дает следующее:
- Выбор без мыши: Часто ли вы копируете и вставляете текст в пределах одного окна? Теперь вы можете делать это, не используя мышь. Откройте панель поиска с помощью cmd-f и найдите текст, который хотите скопировать. Когда часть текста будет найдена, используйте клавишу tab, чтобы увеличить выделение вправо на целое слово, и shift-tab, чтобы уменьшить его влево до предыдущей границы слова. Он автоматически копируется в буфер обмена, или вы можете использовать opt-Enter, чтобы сразу вставить выделение.
Хотя это альфа-версия, я использую ее для всей своей работы в Terminal уже около полутора месяцев, и она довольно стабильна.
Если вы хотите скопировать команды, которые вы вводили на командной строке Bash, вы можете использовать функции редактирования строк readline
в Bash:
Вот пример в (по умолчанию) режиме emacs:
- Нажмите Ctrl–r и введите часть команды, которую вы хотите вспомнить из истории
- Нажмите Ctrl–u, чтобы вырезать (убить) эту строку в буфер для убийства
- Нажмите Ctrl–y, чтобы вставить (вытянуть) буфер для убийства в командную строку (вы можете нажать это несколько раз, чтобы получить повторяющиеся копии)
Существует множество возможностей, включая влияние на части строки или конкретные слова и т.д.
Смотрите man bash
в разделе “Readline” и man readline
для получения дополнительной информации.
Ответ или решение
Для удобной работы в Terminal.app на macOS и выполнения операций копирования текста с помощью клавиатуры, у пользователей есть несколько подходов, позволяющих избежать использования мыши. Ниже я опишу, как можно выбрать текст и скопировать его в буфер обмена, применяя различные методы и инструменты.
Использование стандартных возможностей Terminal.app
К сожалению, Terminal.app в своей стандартной конфигурации не предлагает возможности выбора текста исключительно с помощью клавиатуры. Однако, можно использовать сочетания клавиш для выполнения операций копирования и вставки. Сначала вы можете использовать клавишу Cmd
(⌘) для выделения текста с помощью мыши или вызвать команды, которые автоматически копируют вывод в буфер обмена.
Примечание:
Если вам нужно скопировать весь вывод команды, вы можете использовать программу pbcopy
.
Пример:
netstat -an | pbcopy
Этот способ отлично подходит для копирования всей информации, но не подходит для выборочного копирования определенных линий текста.
Использование screen
или tmux
Для более мощной работы с текстом в терминале рекомендуется использовать терминальные мультиплексоры, такие как screen
или tmux
, которые поддерживают режим "копирования".
Пример работы в screen
:
- Запустите
screen
и выполните нужные действия. - Войдите в режим копирования с помощью комбинации
Ctrl-a [
(удерживайтеCtrl
и нажмитеa
, затем[
). - Перемещайтесь по тексту с помощью клавиш (например,
h
,j
,k
,l
для перемещения по строкам илиw
,b
,e
для перемещения по словам). - Выделите текст с помощью пробела и затем нажмите
Enter
, чтобы скопировать выделенный текст в буфер обмена. - Чтобы вставить текст обратно, используйте
Ctrl-a ]
.
Этот метод требует небольшой практики, но значительно ускоряет работу без использования мыши.
Использование iTerm2
Если вы хотите ещё более продвинутый функционал, обратите внимание на iTerm2 – альтернативный эмулятор терминала для macOS, который имеет множество функций, включая "мультимодальный выбор" текста.
Пример без мыши в iTerm2:
- Откройте панель поиска с помощью
Cmd-f
. - Введите текст для поиска; совпадения будут выделены.
- Используйте
Tab
для увеличения выделенного текста вправо илиShift-Tab
для уменьшения выделения влево. Все автоматически копируется в буфер обмена.
Использование возможностей Bash
Еще один способ – это использование возможностей редактирования строк Bash. Если вам нужно скопировать команды из истории:
- Нажмите
Ctrl-r
и введите часть команды, чтобы найти её в истории. - После нахождения команды вы можете использовать
Ctrl-u
, чтобы вырезать текст в буфер обмена иCtrl-y
, чтобы вставить его обратно.
Таким образом, используя приведённые методы и инструменты, вы можете значительно упростить процесс копирования и вставки в Terminal.app на macOS без необходимости перехода к мыши. Убедитесь, что освоили каждый из этих способов, чтобы выбрать наиболее подходящий для вашего рабочего процесса.