2013-01-05 29 views
14

Tôi muốn một chuỗi lệnh bàn phím nhanh để sao chép lệnh hiện tại tại dấu nhắc bash vào khay nhớ tạm.Sao chép lệnh hiện tại tại dấu nhắc bash vào clipboard

Vì vậy, ví dụ: để sao chép lệnh bash cuối cùng vào khay nhớ tạm, tôi sẽ nhấn + [some command sequence] để sao chép. Hoặc, ví dụ, để tìm kiếm một lệnh trong bash hisory, tôi sẽ sử dụng ctrl + r, search, hiển thị nó trên dấu nhắc lệnh, và sau đó [some command sequence] để sao chép nó, v.v.

Giải pháp hiện tại của tôi là sử dụng bash ống: Pipe to/from the clipboard

Vì vậy, để sao chép các lệnh trước đó vào clipboard:

echo "!!" | pbcopy 

mà không phải là quá khủng khiếp, nhưng những gì nếu lệnh để sao chép không phải là lệnh cuối cùng vv

Cách thích hợp để đạt được những gì tôi đang cố gắng ing để đạt được ở đây?

+0

trong đó hệ thống? – alinsoar

+0

OS X sẽ thực hiện. Một giải pháp Linux & OS X là lý tưởng. –

Trả lời

8

Lấy @ bài Lauri của cảm hứng, đây là một giải pháp sử dụng lệnh bind:

bind '"\C-]":"\C-e\C-u pbcopy <<"EOF"\n\C-y\nEOF\n"' 

Ctrl-] sau đó sẽ sao chép bất cứ thứ gì trên dấu nhắc bash hiện vào clipboard.

Để làm cho nó liên tục, bạn có thể thêm lệnh liên kết như trên vào ~/.bashrc hoặc bạn có thể loại bỏ dấu ngoặc kép bên ngoài và xóa phần 'ràng buộc' của cuộc gọi và thêm kết quả vào số ~/.inputrc.

Người dùng không phải OS-X sẽ phải hoán đổi pbcopy bằng lệnh thích hợp, có thể là xclip.

Trích dẫn một heredoc được sử dụng thay vì một kỹ thuật echo + pipe sao cho cả dấu ngoặc kép đơn và kép trong lệnh tại dấu nhắc bash được giữ nguyên. Với kỹ thuật này, ví dụ, tôi đã có thể nhấn ctrl-], sao chép lệnh bind thực tế từ dấu nhắc thiết bị đầu cuối và dán nó vào đây trong câu trả lời. Vì vậy, kỹ thuật heredoc xử lý tất cả các ký tự đặc biệt trong lệnh bind ở đây.

+0

Làm thế nào chúng ta có thể sửa đổi lệnh này để loại trừ dòng mới ở cuối từ những gì được sao chép? Nếu tôi sao chép bất kỳ lệnh Terminal nào theo cách này, khi dán dòng mới cuối cùng sẽ buộc lệnh thực thi tự động, điều đó không phải là thứ tôi muốn - thường cần chỉnh sửa lệnh đã dán trước khi thực thi. Tôi đã cố gắng để loại bỏ '\ n' nhưng nó không hoạt động. – certainlyakey

+1

"Người dùng không phải OS-X sẽ phải hoán đổi pbcopy với lệnh thích hợp, có thể là xclip." → [xem tại đây] (http://jetpackweb.com/blog/2009/09/23/pbcopy-in-ubuntu -giao diện dòng-clipboard /) –

1

Nếu xsel được cài đặt trên hệ thống của bạn, bạn có thể thêm này trong .inputrc:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xsel -ib\n\C-y\nEOF\n' 

Ngoài ra, nếu xclip được cài đặt bạn có thể thêm này:

C-]: '\C-e\C-ucat <<EOF | tr -d "\\n" | xclip -se c\n\C-y\nEOF\n' 

Chú ý: Mã được sử dụng từ câu trả lời của @ Clayton.

5

Bạn có thể sử dụng READLINE_LINE với bind -x trong bash 4:

copyline() { printf %s "$READLINE_LINE"|pbcopy; } 
bind -x '"\C-xc":copyline' 

Bạn có thể cài đặt bash 4 và làm cho nó vỏ đăng nhập mặc định bằng cách chạy brew install bash;echo /usr/local/bin/bash|sudo tee -a /etc/shells;chsh -s /usr/local/bin/bash.

tôi cũng sử dụng chức năng này để sao chép các lệnh cuối cùng:

cl() { history -p '!!'|tr -d \\n|pbcopy; } 
2

tôi đã dành một số tiền khá thời gian ngày nay viết một đơn giản thực hiện zsh cho MacOS; sử dụng như sau:

example command:   git commit -m "Changed a few things" 
command that copies:  c git commit -m "Changed a few things" 

# The second command does not actually execute the command, it just copies it. 

# Using zsh, this should reduce the whole process to about 3 keystrokes: 
# 
# 1) CTRL + A (to go to the beginning of the line) 
# 2) 'c' + ' ' 
# 3) ENTER 

preexec() là một chức năng móc zsh đó được gọi là đúng khi bạn nhấn enter, nhưng trước khi lệnh thực sự được thực thi.

Kể từ dải luận zsh của một số ký tự như '"', chúng tôi sẽ muốn sử dụng preexec(), cho phép bạn truy cập vào chưa qua chế biến, lệnh ban đầu

Mã giả đi như thế này:.

1) Thực hiện chắc chắn lệnh có 'c ' vào đầu

2) Nếu có, sao chép toàn bộ lệnh, char của char, để một biến temp

3) ống các biến temp vào 01.238., hệ điều hành MacOS của bộ đệm bản sao

Bất động đang:

c() {} # you'll want this so that you don't get a command unrecognized error 

preexec() { 
    tmp=""; 
    if [ "${1:0:1}" = "c" ] && [ "${1:1:1}" = " " ] && [ "${1:2:1}" != " " ]; then         
    for ((i=2; i<${#1}; i++)); do 
     tmp="${tmp}${1:$i:1}"; 
    done 
    echo "$tmp" | pbcopy; 
    fi 
} 

Đi trước và dính hai chức năng nói trên trong tập tin zshrc của bạn, hoặc bất cứ nơi nào bạn muốn (tôi đặt tôi trong một tập tin trong thư mục .oh-my-zsh/custom của tôi).

Nếu có ai có giải pháp thanh lịch hơn, hãy lên tiếng. Mọi thứ cần tránh khi sử dụng chuột.

0

tôi sử dụng history để tìm số lệnh mà tôi đang tìm kiếm, sau đó tôi làm:

echo "!command_number" | xclip -in 
Các vấn đề liên quan