Selecione o texto de Terminal.app usando o teclado no OS X

6

Eu gosto de copiar coisas do terminal, mas não gosto de ter que passar para o mouse. Como você seleciona o texto no Terminal.app usando o teclado?

Por exemplo, enquanto estiver no Terminal, pode-se desejar mover para um ponto em uma linha e, em seguida, destacar uma parte do texto com as teclas de seta para a esquerda e para a direita, que podem ser cortadas ou copiadas. Isso é possível?

    
por hekevintran 29.03.2010 / 04:29

2 respostas

12

Se você quiser copiar a saída de um comando, use pbcopy . Para obter resultados específicos, use grep .

Por exemplo, para copiar toda a saída de netstat -an :

netstat -an | pbcopy

Para copiar apenas a saída de portas abertas (escuta):

netstat -an | grep LISTEN | pbcopy

Terminal.app em si não tem uma maneira de usar o teclado para selecionar texto, mas usando um multiplexador de terminal como tela ou tmux, você pode fazê-lo em "modo de cópia". A tela é instalada no OS X por padrão, e o tmux pode ser instalado através de uma ferramenta de terceiros, como Homebrew ou Macports. A página man para ambos os programas descreve o modo de cópia e como selecionar o texto a ser copiado para a área de transferência. Na man page da tela, mais informações sobre como navegar no modo de cópia podem ser encontradas na seção CUSTOMIZATION em copy . Um trecho abaixo:

   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.

Isso ainda não interage com a área de transferência do sistema, então você teria que copiar a saída de alguma forma, talvez fazendo eco do conteúdo do buffer de colar para o pbcopy. Exemplo de fluxo de trabalho:

(C-a [é "hold control aperte A e então aperte [", same for]. veja a página man da tela).

  1. Inicie a tela e trabalhe lá.
  2. Entre no modo de cópia: C-a [
  3. Navegue usando o vi keybindings (ou configure para usar as ligações do emacs pela página man).
  4. Iniciar a seleção de texto com a barra de espaço.
  5. Pressione Enter para copiar a seleção para colar o buffer. Isso sai do modo de cópia.
  6. Cole o buffer com C-a]

    echo 'C-a ]' | pbcopy

(não digite literalmente C-a], use a tecla de atalho conforme descrito acima, use aspas quando necessário)

O texto selecionado deve estar na área de transferência do sistema e você pode colá-lo em outra janela. Por exemplo, o seguinte:

   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.

Foi a partir da página man tela de fazer o acima:).

Agora, tudo isso dito, e você menciona o Terminal.app especificamente, um novo recurso do iTerm2 versão 0.20.20101102 que está em teste alfa mostra:

  • Mouseless Selection: você costuma copiar e colar o texto dentro da mesma janela? Agora você pode fazer isso sem usar o mouse. Abra a barra de localização com cmd-f e procure o texto que você deseja copiar. Quando parte do texto é correspondida, use a tecla tab para expandir a seleção para a direita por uma palavra completa e uma aba shift para expandi-la para o limite da palavra anterior. É copiado automaticamente para a área de transferência ou você pode usar opt-Enter para colar a seleção imediatamente.

Embora seja alfa, eu tenho usado para todo o meu trabalho do Terminal por cerca de um mês e meio e é bastante estável.

página inicial do iTerm2

    
por 29.03.2010 / 05:09
1

Se você deseja copiar os comandos digitados em um prompt do Bash, é possível usar os recursos de edição de linha readline do Bash:

Aqui está um exemplo no modo (padrão) emacs:

  • Pressione Ctrl - r e digite parte do comando que você gostaria de lembrar do histórico
  • Pressione Ctrl - u para cortar (matar) essa linha no buffer de eliminação
  • Pressione Ctrl - y para colar (puxar) o buffer kill na linha de comando (você pode pressioná-lo várias vezes para ter cópias repetidas)

Existem muitas possibilidades, incluindo partes afetadas da linha ou palavras específicas, etc.

Veja man bash no " Readline "e man readline para mais informações.

    
por 10.04.2010 / 20:13