Cập nhật ngày 7 tháng 4: Một phiên bản khác được thêm và tìm thấy Albert, xem bản cập nhật và phần thưởng dưới đây !!!
Liên quan đến chức năng dấu gạch ngang : Bạn đã hỏi " Có cách nào thay đổi hành vi mặc định của trình khởi chạy để kiểm tra điều này trước khi mở một cửa sổ mới không ". Câu trả lời cơ bản là, không, với tư cách là người dùng thông thường, bạn không có cách nào để thêm hành vi đó vào dấu gạch ngang. Tuy nhiên, nếu có một nhà phát triển phạm vi thống nhất, những người sẵn sàng thực hiện điều đó, bạn có thể tiếp cận họ hoặc tự mình phát triển nếu bạn quyết tâm và sẵn sàng học hỏi. Kỹ năng mã hóa của tôi rất khiêm tốn, do đó tôi sử dụng kịch bản shell và giao diện đồ họa có sẵn cho các kịch bản như một cách giải quyết.
Thông tin liên quan
Bài gốc:
Tôi đã viết một kịch bản sử dụng đoạn hội thoại và wmctrl để đạt được những gì bạn yêu cầu. Lưu ý rằng đây là một tập lệnh đồ họa, có nghĩa là nó sẽ chỉ hoạt động với các cửa sổ, trong GUI và sẽ không hoạt động nếu bạn cố gắng khởi chạy một cái gì đó trong tty. Ngoài ra, từ những gì tôi hiểu Alfred làm chính xác điều tương tự. Bạn có thể tạo một lối tắt trên màn hình cho nó hoặc phím tắt launcher cho nó, như được mô tả ở đây và ở đây .
Kịch bản:
#!/bin/bash
# Author: Serg Kolo
# Description: A launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 6 , 2015
#
MYPROG=$( zenity --entry --title='MY LAUNCHER' --text='Type the name of application to run' )
sleep 0.5
wmctrl -lx | awk '{print $3}' | grep -i "$MYPROG"
if [ $? -eq 0 ]; then
sleep 1
wmctrl -xa $MYPROG
#as an alternative try the line bellow
#wmctrl -a $MYPROG
exit 1
else
$MYPROG &
exit 0
fi
Ghi chú bên lề: trong phiên bản trước, tập lệnh đã sử dụng echo $?, Để kiểm tra xem các biểu thức trước đó đã thoát thành công chưa. Theo đề xuất của muru (từ bản chỉnh sửa), tôi đã thay đổi mã thành phiên bản nhỏ gọn hơn một chút, vì vậy tôi khuyên bạn nên xem phiên bản trước và phiên bản hiện tại.
Ngoài ra, trước đây wmctrl -a $MYPROG
không hoạt động với thử nghiệm trình duyệt google-chrome hoặc chromium; vì một số lý do ngu ngốc, một số chương trình có thuộc tính WM_CLASS của cửa sổ được viết hoa, trong khi chương trình được liệt kê dpkg --get-selections
là chữ thường (chỉ cần đọc man wmctrl
và chạy wmctrl -lx
, bạn sẽ biết). Thêm vào đó -ax nên quan tâm đến điều này. Kịch bản hiển thị cửa sổ crom đã mở như bình thường
Một điều nữa - wmctlr hơi kỳ lạ ở chỗ đôi khi nó cần một độ trễ (đã có kinh nghiệm với nó trong một kịch bản khác), vì vậy tôi đã phải thêm sleep 1
dòng. Trước đây nó sẽ là loại bật và tắt với firefox, nhưng bây giờ hoạt động bơi lội.
Kịch bản đang hoạt động
Trong phần hoạt hình dưới đây, bạn có thể thấy rằng trong lần chạy đầu tiên của tập lệnh, có một phiên bản firefox mở và tập lệnh chuyển trọng tâm sang cửa sổ đó; trong thử nghiệm thứ hai, tôi mở phiên bản mới của google-chrome, chưa được mở trước đó. (Lưu ý bên lề: Nếu bạn tò mò về máy tính để bàn, nhân tiện, đó là openbox với dock cairo)
Mỗi đề xuất trong các bình luận, hình ảnh động được loại bỏ, chỉ liên kết được đăng. Báo cáo nếu nó bị hỏng xin vui lòng!
http://i.stack.imgur.com/puuPZ.gif
Cập nhật, ngày 7 tháng 4
Tôi đã cải thiện phần nào kịch bản để làm cho tất cả các chương trình được liệt kê trong hộp nhập xuống của zenity. Bây giờ người dùng không phải ghi nhớ từng chương trình, mà chỉ có thể cuộn qua danh sách của chúng bằng các phím mũi tên hoặc chỉ cần mở menu thả xuống. Ngoài ra, phiên bản cải tiến này tăng các cửa sổ không phải bằng tên, mà bằng id cửa sổ, mang lại hiệu suất tốt hơn nhiều. Lưu ý, cách tôi đi qua các tệp .desktop là loại dự phòng, sử dụng lệnh cắt hai lần, nhưng vì tập lệnh-fu của tôi không tốt cho đến nay, đây là tất cả những gì tôi có thể làm. Đề xuất cải tiến được chào đón!
#!/bin/bash
# Author: Serg Kolo
# Description: Second version of a launcher script that checks whether
# or not a window of a particular program already exists
# If a window of such program is open, bring it to focus
# Otherwise - launch a new window
# Written for /ubuntu//q/440142/295286
# Date: April 7 , 2015
#
set -x
MYPROG=$(zenity --entry --text 'Select program from list' --entry-text $(ls /usr/share/applications/*.desktop | cut -d'/' -f5 | cut -d'.' -f1 | xargs echo))
sleep 0.5
# Do we have a window of such program ?
wmctrl -lx| awk '{print $3}' | grep -i $MYPROG
if [ $? -eq 0 ]; then
sleep 0.5 # if yes, find that window id, and raise it
WINID=$(wmctrl -lx | grep -i $MYPROG | awk 'NR==1{print $1}')
wmctrl -ia $WINID &
# exit 0
else
echo $MYPROG | grep -i libreoffice
if [ $? -eq 0 ]
then
MYPROG=$(echo $MYPROG | sed 's/-/ --/g')
fi
$MYPROG &
# exit 0
fi

Tặng kem:
Tôi thực sự đã tìm thấy Albert , phiên bản Linux của Alfred, nhưng bản thân tôi chưa thử. Đáng để kiểm tra mặc dù. Tuy nhiên, như Jacob đã lưu ý, nó vẫn còn lỗi.
Có một ứng dụng tên là Gnome-Do, có đồ họa trông giống với Alfred, tuy nhiên nó không có chức năng tương tự như tập lệnh này.

Hãy cho tôi biết nếu bạn thích tập lệnh này, nếu có bất cứ điều gì cần sửa chữa và đừng quên nêu lên câu trả lời nếu bạn thấy nó hữu ích