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.
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 ~/.zshrc
perfil.
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 $CUTBUFFER
contiene el texto que se acaba de cortar, y la pbcopy
utilidad 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. :-)
bindkey '^K'
para revelar qué función/widget ^k también está vinculado. De forma predeterminada, está vinculado a kill-line
lo 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 :
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
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.
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.
delay
porque 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.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 window
que solo actuará en la ventana frontal y no en la otras ventanas de Terminal.
Natsfán
Tomás David Baker
david anderson
Natsfán
Tomás David Baker
Tomás David Baker
clipboard=unnamed
opción y funciona para vim-in-terminal.