Haga que Ctrl-k en la Terminal copie al portapapeles del sistema

Me gustaría que lo que haya "cortado" por última vez con Ctrl-k en Terminal esté disponible en mi editor de texto cuando presione Cmd-v. ¿Es eso posible? O algo parecido?

Actualización con explicación adicional: Ctrl-k está por defecto en la Terminal "eliminar hasta el final de la línea". Además de eliminarlo, coloca el texto eliminado en el portapapeles de la Terminal (emacs "kill ring") y se puede recuperar con Ctrl-y. Este es esencialmente un segundo portapapeles separado del portapapeles del sistema. Quiero usar el mismo portapapeles para Terminal y para el resto del sistema, como mi editor de texto.

¿Qué pasa con cmd-x?
Cmd-x no 'corta' desde la Terminal (ni siquiera copia).
Echo de menos leer la pregunta. Borré mi respuesta.
¿Estás ejecutando bash shell? Cmd-x no corta desde la terminal pero copia. Para mí de todos modos. Estoy usando iTerm. Acabo de probar en la terminal y cmd-x no funcionó. Pero comando-c funcionó.
Sí, bash. Puedo copiar desde la Terminal usando el mouse y Cmd-c pero no quiero interrumpir mi flujo para hacer eso. Quiero cualquier atajo de teclado que esté usando en la terminal para cortar/copiar para enviar ese mismo texto al portapapeles del sistema. Por ejemplo, en la terminal que usa accesos directos similares a emacs (los predeterminados listos para usar) puedo usar Ctrl-a para saltar al comienzo de la línea de comando y Ctrl-k para "cortar" (matar en términos de emacs) el contenido de la línea. Este texto se puede pegar (tirar en términos de emacs) con Ctrl-y. Pero si voy a otro programa no tengo acceso a lo que corto. ¿Tiene sentido?
Otra pequeña nota que probablemente sea irrelevante: vim admite esto (cuando se compila con + portapapeles) a través de la clipboard=unnamedopción y funciona para vim-in-terminal.

Respuestas (2)

Hay una solución muy simple si está dispuesto a ampliar la funcionalidad de su shell. (Aunque es genial ver la solución de automatización)

Suponiendo que está utilizando zsh, el shell predeterminado actual de macOS, simplemente agréguelo a su ~/.zshrcperfil.

pb-kill-line () {
  zle kill-line   # `kill-line` is the default ctrl+k binding
  echo -n $CUTBUFFER | pbcopy
}

zle -N pb-kill-line  # register our new function

bindkey '^K' pb-kill-line  # change the ctrl+k binding to use our new function

Todo lo que hace es envolver la combinación de teclas Ctrl+ kpara que, además de realizar su comportamiento predeterminado ( kill-line), también copie el texto relevante en el portapapeles de todo el sistema. El misterioso $CUTBUFFERcontiene el texto que se acaba de cortar, y la pbcopyutilidad macOS coloca todo lo que recibe del STDIN en el portapapeles del sistema.

¡Esta solución se copió principalmente de https://gist.github.com/welldan97/5127861 ! Mi único contenido original es la explicación. :-)

¡ja, gracias por seguir leyendo una pregunta tan antigua! Me alegro de que fuera útil
No encuentro nada sobre pb-kill en ~/.zshrc, sin embargo, el texto eliminado por ^k se mueve a la mesa de trabajo, lo cual es realmente extraño. No sé qué le hice a mi cartón.
@DawnSong ejecuta bindkey '^K'para revelar qué función/widget ^k también está vinculado. De forma predeterminada, está vinculado a kill-linelo que no creo que se sincronice con la mesa de trabajo. Aunque si no es una línea de muerte, busque qué es y probablemente tenga la respuesta. (es posible que esté usando algunas configuraciones de zsh que agregan oh-my-zsh, por ejemplo)

No creo que lo que estás pidiendo sea fácilmente factible. Creo que las funciones secundarias de cortar y pegar están aisladas en cada aplicación que las admita y probablemente requiera atrapar mediante programación la secuencia de teclas de destino y procesarlas en consecuencia. Esto es algo que probablemente tendría que escribirse en C y/o Objective-C , compilarse en un ejecutable y permanecer residente en la memoria.

Sin embargo, dicho esto, creo que el atajo ^K solo corta la última línea de texto desde la posición del cursor y la coloca en la mesa de trabajo secundaria . Entonces, con eso como entendimiento, permítanme ofrecer lo siguiente como una solución alternativa .

El siguiente código AppleScript de ejemplo , que se muestra más adelante, se usará en un servicio de Automator , donde luego se puede asignar un atajo de teclado al servicio . Este servicio utilizará, por ejemplo, ⌃⇧K (Control-Shift-K) y logrará el objetivo del OP. Que es obtener lo que se coloca en el tablero de trabajo secundario en Terminal , normalmente presionando ⌃K , en el tablero de trabajo del sistema general , también conocido como Portapapeles , aunque presionando, por ejemplo, ⌃⇧K en su lugar.

Lo siguiente fue creado, probado y funciona para mí en macOS High Sierra .


Cree el servicio de Automator ...

En Automatizador :

  1. Archivo > Nuevo , o presione: ⌘N
  2. Seleccione Servicio y haga clic en el botón Elegir .
  3. Configure los ajustes como se muestra en la primera imagen a continuación.
  4. Agregue una acción Ejecutar AppleScript .
  5. Reemplace el código predeterminado con el código AppleScript de ejemplo .
  6. Guardar como, por ejemplo: Mi Ctrl-K para Terminal

Servicio de automatización


Ejemplo de código AppleScript :

tell application "Terminal"
    if (count windows) is greater than 0 then
        try
            activate
            set c1 to contents of selected tab of front window
            tell application "System Events" to ¬
                keystroke "k" using control down
            delay 0.5
            set c2 to contents of selected tab of front window
        end try
    else
        return
    end if
end tell

tell current application
    set pCount to (count paragraphs of text of c1)
    repeat with i from 1 to pCount
        if (count characters of (paragraph i of c1)) is greater than 0 then
            set t1 to (paragraph i of c1)
            set t2 to (paragraph i of c2)
        end if
    end repeat

    if (count characters of t1) is not equal to (count characters of t2) then
        set AppleScript's text item delimiters to {t2}
        set CtrlY to text items of t1
        set AppleScript's text item delimiters to {}
        set the clipboard to CtrlY as text
    end if
end tell
  • Nota: El código AppleScript de ejemplo es solo eso y no contiene ningún otro manejo de errores que el que pueda estar presente. La responsabilidad siempre recae sobre el usuario para emplear el manejo de errores adecuado según sea necesario o deseado.
  • El valor del delay comando puede o no necesitar ser ajustado para su sistema. Ajuste el valor según sea necesario o agregue delay comandos adicionales según sea necesario.

Asignando el atajo de teclado...

En Preferencias del Sistema ...

  • Preferencias del sistema > Teclado > Accesos directos > Servicios agregue ⌃⇧K (presione Control-Shift-K) al servicio Mi Ctrl-K para Terminal , como se muestra en la imagen a continuación.

    • Nota: Unas palabras sobre el acceso directo que asigne... ⌃⇧K se ofrece como una sugerencia; sin embargo, deberá seleccionar uno que no entre en conflicto con Terminal (o cualquier otra aplicación que tenga el foco si configura el servicio en cualquier aplicación ) cuando se presiona. Esto puede requerir una combinación extraña o un combo de cuatro caracteres. ⌃⇧K trabajó para mí en Terminal . YMMV

Atajos de teclado


Ahora en Terminal , cuando uno presiona ⌃⇧K obtendrá en el Portapapeles lo que ⌃K coloca en el portapapeles secundario .


Como nota al margen, si usa un programa como FastScripts , solo necesita usar el código AppleScript de ejemplo como un .scpt en el Editor de secuencias de comandos , no crear un servicio de Automator y puede asignar el atajo de teclado en las Preferencias para FastScripts . Ninguna de las otras instrucciones se aplica a menos que desee hacerlo todo de forma nativa sin el uso de software de terceros.

Tenga en cuenta que no estoy afiliado con el desarrollador de FastScripts, solo soy un usuario satisfecho.

¡Esto es increíble! Gracias. Tuve problemas con ⌃⇧K como sugeriste, pero funciona en otras combinaciones de teclado. Tiene el efecto secundario ligeramente extraño de colocar todas las ventanas abiertas de la Terminal frente a todas las demás ventanas. ¿Hay alguna forma de evitarlo? Gracias de nuevo.
Eliminé tanto el retraso como la llamada a 'activar'. No estoy seguro si eso es malo, pero ahora parece hacer lo que quiero :)
¡Dios mío, ahora varios programas diferentes parecen no estar de acuerdo con lo que hay en el portapapeles del sistema! Jugaré un poco más y veré si puedo averiguar qué está pasando...
@Thomas David Baker, sí, creo que hay una manera de abordar ese "efecto secundario un poco extraño"... déjame probar algunos códigos diferentes y arreglos de ventanas y te responderé. Lo dejaría delayporque en las pruebas lo encontré necesario, pero si te funciona, genial. La razón por la que el activate comando está allí es para asegurar que la pulsación de tecla vaya a esa ventana, pero probablemente no sea realmente necesaria porque la ventana de destino tendría el foco porque movió el cursor al punto de corte justo antes de presionar el atajo.
Cualquiera que sea la rareza con Chrome y Sublime Text en desacuerdo sobre lo que estaba en el portapapeles, desapareció después de que deshabilité, devolví el retraso y volví a habilitar el servicio. Definitivamente veo que esto se está imponiendo desde el "exterior" en lugar de que Terminal lo haga por sí mismo, por lo que tiene algunas limitaciones de la perfección, pero definitivamente me desesperé de que esto funcionara, así que muchas gracias, ¡es bastante cerca de perfecto!
@Thomas David Baker, Sí, las soluciones alternativas rara vez son perfectas, de ahí que se las llame soluciones alternativas. :) ¡Me alegro de que puedas usarlo!
@Thomas David Baker, Por cierto, como alternativa al uso del activate comando , en este caso particular (que, como se mencionó anteriormente, probablemente no sea necesario) es usar el siguiente comando , tell application "System Events" to tell process "Terminal" to perform action "AXRaise" of front windowque solo actuará en la ventana frontal y no en la otras ventanas de Terminal.
¡Esto fue realmente genial de ver! No tenía idea de cuán extensible es realmente la herramienta de automatización integrada de macOS