6

Мне нравится копировать вещи из терминала, но я не люблю переходить к мышке. Как вы выбираете текст в Terminal.app с помощью клавиатуры?

Например, в терминале можно хотеть иметь возможность перейти к точке на линии, а затем выделить часть текста с помощью клавиш со стрелками влево и вправо, которые затем можно вырезать или скопировать. Это возможно?

2 ответа2

12

Если вы хотите скопировать вывод из команды, вы можете использовать pbcopy . Чтобы получить конкретный вывод, используйте grep .

Например, чтобы скопировать весь вывод netstat -an:

netstat -an | pbcopy

Чтобы только скопировать вывод открытых портов (прослушивание):

netstat -an | grep LISTEN | pbcopy

Сам Terminal.app не имеет возможности использовать клавиатуру для выбора текста, но используя мультиплексор терминала, такой как screen или tmux, вы можете сделать это в "режиме копирования". По умолчанию Screen устанавливается в OS X, а tmux можно установить с помощью стороннего инструмента, такого как Homebrew или Macports. Страница man для обеих программ описывает режим копирования и как выбрать текст для копирования в буфер обмена. На странице справки экрана больше информации о режиме копирования можно найти в разделе CUSTOMIZATION под copy . Выдержка ниже:

   copy

   Enter  copy/scrollback mode. This allows you to copy text from the cur-
   rent window and its history into the paste buffer. In this mode  a  vi-
   like `full screen editor' is active:
   Movement keys:
     h, j, k, l move the cursor line by line or column by column.
     0,  ^  and  $  move to the leftmost column, to the first or last non-
       whitespace character on the line.
     H, M and L move the cursor to the leftmost column of the top,  center
       or bottom line of the window.
     + and - positions one line up and down.
     G moves to the specified absolute line (default: end of buffer).
     | moves to the specified absolute column.
     w, b, e move the cursor word by word.
     B, E move the cursor WORD by WORD (as in vi).
     C-u  and  C-d  scroll  the display up/down by the specified amount of
       lines while preserving the cursor position. (Default: half  screen-
       full).
     C-b and C-f scroll the display up/down a full screen.
     g moves to the beginning of the buffer.
     % jumps to the specified percentage of the buffer.

Это по-прежнему не взаимодействует с системным буфером обмена, поэтому вам придется каким-то образом скопировать вывод, возможно, путем вывода содержимого буфера вставки в pbcopy. Пример рабочего процесса:

(Ca [означает «удерживать нажатой кнопку управления A, а затем нажать [», то же самое для]. См. Справочную страницу экрана.)

  1. Запустите экран и сделайте там работу.
  2. Войдите в режим копирования: Ca [
  3. Перемещайтесь с помощью сочетаний клавиш vi (или используйте привязки emacs для каждой страницы руководства).
  4. Начать выделение текста с пробела.
  5. Нажмите Enter, чтобы скопировать выделение, чтобы вставить буфер. Это выходит из режима копирования.
  6. Вставьте буфер с Ca]

    эхо 'Ca]' | pbcopy

(буквально не вводите Ca], используйте связывание клавиш, как описано выше, используйте кавычки, где это необходимо)

Выбранный вами текст должен находиться в системном буфере обмена, и вы можете вставить его в другое окно. Например следующее:

   paste [registers [dest_reg]]

   Write  the  (concatenated)  contents  of the specified registers to the
   stdin queue of the current window. The register . is treated  as  the
   paste  buffer. If no parameter is given the user is prompted for a sin-
   gle register to paste.  The paste buffer can be filled with  the  copy,
   history  and  readbuf commands.  Other registers can be filled with the
   register, readreg and paste commands.  If paste is called with a second
   argument,  the  contents  of the specified registers is pasted into the
   named destination register rather than the window. If .  is  used  as
   the  second  argument,  the  displays  paste buffer is the destination.
   Note, that "paste" uses a wide variety of resources: Whenever a  second
   argument  is  specified  no  current  window is needed. When the source
   specification only contains registers (not the paste buffer) then there
   need not be a current display (terminal attached), as the registers are
   a global resource. The paste buffer exists once for every user.

Был с экрана man-страницы из вышеперечисленного :).

Теперь все, что сказано, и вы упомянули Terminal.app, в частности, новую функцию iTerm2 версии 0.20.20101102, которая находится в альфа-тестировании, показывает:

  • Выбор без мыши: Вы часто копируете и вставляете текст в одно и то же окно? Теперь вы можете сделать это без использования мыши. Откройте панель поиска с помощью cmd-f и найдите текст, который вы хотите скопировать. Когда часть текста совпадает, используйте клавишу табуляции, чтобы расширить выделение вправо на целое слово, и клавишу Shift, чтобы развернуть его влево до предыдущей границы слова. Он автоматически копируется в буфер обмена, или вы можете использовать opt-Enter, чтобы немедленно вставить выбор.

Хотя это альфа, я использую его для всей работы терминала примерно полтора месяца, и он достаточно стабилен.

Домашняя страница iTerm2

1

Если вы хотите скопировать команды, которые вы ввели в приглашении Bash, вы можете использовать функции редактирования строки readline Bash:

Вот пример в режиме emacs (по умолчанию):

  • Нажмите Ctrl - r и введите часть команды, которую вы хотите вызвать из истории.
  • Нажмите Ctrl - u, чтобы вырезать (убить) эту строку в буфере уничтожения
  • Нажмите Ctrl - y, чтобы вставить (восстановить) буфер уничтожения в командную строку (вы можете нажать его несколько раз, чтобы иметь повторные копии)

Есть много возможностей, включая воздействие на части строки или отдельные слова и т.д.

Смотрите man bash в разделе "Readline" и man readline для получения дополнительной информации.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .