Pilih atau salin baris input saat ini di Terminal.app

2

Apakah ada hotkey untuk memilih semua teks input pada baris input di Terminal.app OS X?

erikvold
sumber
Apakah Anda ingin memilih dengan maksud untuk menyalin atau dengan maksud untuk mengganti?
NReilingh
semua yang di atas
erikvold
Jika Anda ingin menyalin dan mengganti, saya sangat menyarankan Anda melihat edit-and-execute-command. Seharusnya bisa menyelesaikan keduanya, dengan skrip minimal yang sesuai EDITOR.
Daniel Beck
2
Ini akan menjadi agak mencurigakan, karena baris perintah benar-benar tidak memiliki konsep teks yang dipilih, juga teks yang dipilih mouse tidak akan diganti ketika jika Anda terus mengetik. Jawaban atas pertanyaan Anda adalah "tidak", tetapi saran Daniel mungkin membantu Anda meretas pengganti. Beberapa hal lain yang mungkin membantu: control-a dan control-e dapat digunakan untuk melompat ke awal dan akhir dari apa pun yang Anda ketikkan pada prompt, dan Anda dapat merancang hotkey keystroke Anda sendiri untuk terminal menggunakan Automator, Layanan, dan Skrip GUI AppleScript.
NReilingh
@NReilingh Ping Anda; saat Anda memikirkan saran saya, Anda mungkin tertarik pada apa yang saya dapat lakukan.
Daniel Beck

Jawaban:

1

Anda dapat mencoba memfilter edit-and-execute-command()( manual ) melalui yang sesuai $EDITORatau $VISUAL:

$ touch foo.sh
$ open foo.sh

Tetapkan foo.shkonten sebagai berikut, dan simpan:

#!/usr/bin/env bash
# copy current command input to clipboard -- requires local session
cat $1 | pbcopy

# clear the prompt, so no command gets executed when closing this script
# comment out the following line to execute the command you entered instead
echo -n "" > $1
exit 0

Kemudian buat executable dan atur ke visual:

$ chmod +x foo.sh
$ export VISUAL=/Users/danielbeck/foo.sh

Pada bashprompt (atau readlineprompt bertenaga apa pun menurut saya), Anda dapat menyalin input perintah saat ini dengan menekan Ctrl-X Ctrl-Euntuk memanggil edit-and-execute-command().

Edit ~/.inputrcfile Anda untuk mengubah hotkey untuk itu. Sunting Anda .bash_profileuntuk menyimpan ini karena $EDITOR/ $VISUAL- kelemahan Anda jelas $EDITOR, sayangnya Anda tidak akan pernah memiliki hak yang layak lagi


Atau, Anda dapat mencoba meniru apa yang dilakukan pengguna ini , tetapi dia menggunakan zsh, bukan bash.


Terminal itu sendiri tidak mengetahui bagian mana dari baris saat ini adalah prompt Anda, dan bagian apa input Anda. Jadi mengakses garis itu misalnya melalui AppleScript tidak akan berfungsi secara umum.

Anda dapat, bagaimanapun, membaca output lengkap dari tab saat ini dan mendapatkan baris terakhirnya, dan, melalui pemfilteran, cobalah untuk menghapus bagian prompt dari tab itu.

Prompt saya diakhiri dengan $, jadi perintah berikut ini berfungsi:

tell application "Terminal" tell selected tab of window 1 to do shell script "echo '" & history & "' | sed '/^$/d' | tail -n1 | cut -d$ -f2-"

Ini akan mendapatkan historyproperti tab saat ini dari jendela saat ini, dan menyaringnya seduntuk menghapus semua baris kosong, kemudian mendapatkan baris terakhir menggunakan tail, dan kemudian menghapus semuanya hingga dan termasuk yang pertama $dari baris (yaitu prompt saya) menggunakan cut.

Output dari program ini adalah baris perintah Anda saat ini. Latihan yang benar-benar tidak berguna:

~ $ osascript Library/Scripts/get_line.scpt 
 osascript Library/Scripts/get_line.scpt

Untuk menyalinnya ke clipboard Anda di akhir, ubah sebagai berikut:

tell application "Terminal" to tell selected tab of window 1 to do shell script "echo '" & history & "' | sed '/^$/d' | tail -n1 | cut -d$ -f2- | pbcopy"

Anda dapat menggunakan Automator untuk membuat layanan yang tidak menerima input di terminal aplikasi dan melakukan tindakan Jalankan AppleScript Script tunggal yang terdiri dari kode di atas. Simpan, dan secara opsional tentukan pintasan keyboard di Preferensi Sistem »Keyboard» Pintasan Keyboard »Layanan .

Daniel Beck
sumber
Sudahkah Anda (atau orang lain) menemukan cara yang lebih baik untuk menyingkirkan string cepat dalam contoh terakhir?
Lri
@Lri Anda dapat, dalam bashproses terpisah , echo $PS1setelah memuat file profil untuk membuat template yang baik yang dihapus dari output. Sayangnya, hal-hal seperti $PWDdan dateakan merusak metode ini. Atau, seseorang dapat membuat cadangan $PS1ke variabel lain sementara, dan mengembalikannya setelah menjalankan perintah.
Daniel Beck