Binding Super + C Super + V để sao chép và dán


23

Đôi khi tôi đã quan tâm đến việc ràng buộc Windows Key (Super_L) trên bàn phím của mình để Sao chép và Dán không vì lý do nào khác ngoài sự thuận tiện và nhất quán giữa máy tính để bàn và MacBook của tôi.

Tôi nghĩ rằng tôi đã gần gũi sau khi đọc về xmodmap và thực hiện như sau:

$ # re-map Super_L to Mode_switch, the 3rd col in keymap table `xmodmap -pke`
$ xmodmap -e "keycode  133 = Mode_switch"

$ # map Mode_switch+c to copy
$ xmodmap -e "keycode  54 = c C XF86_Copy C"

$ # map Mode_switch+v to paste
$ xmodmap -e "keycode  55 = v V XF86_Paste V"

Thật không may, XF86Copy và XF86Paste dường như không hoạt động. Chúng được liệt kê trong /usr/include/X11/XF86keysym.hxevcho thấy chuỗi khóa đang được X diễn giải là XF86Paste và XF86Copy, những biểu tượng này có thực sự hoạt động không? Họ có phải có hỗ trợ cấp ứng dụng?

Câu trả lời:


18

Liên kết siêu với Ctrl

Điều gì về việc ràng buộc Windows/Logo/Superphím trái của bạn để hoạt động như một Ctrlkhóa khác ?

Bạn có thể đạt được điều đó với các lệnh xmodmap sau:

remove mod4 = Super_L
keysym Super_L = Control_L
add Control = Control_L

Giả sử bạn đã lưu các dòng trên vì super_as_ctrl.xmodmapbạn có thể kiểm tra hiệu ứng bằng cách thực thi

xmodmap super_as_ctrl.xmodmap

Để thay đổi vĩnh viễn (tồn tại lại đăng nhập / khởi động lại) đổi tên tệp thành .Xmodmaptrong thư mục nhà của bạn.

(Phần trên đã được thử nghiệm trên hệ thống trực tiếp Ubuntu 11.10, nhưng nó cũng giống với các bản phân phối Linux khác)


Điều chỉnh các phím tắt Sao chép / Dán cho chương trình thiết bị đầu cuối của bạn

Đã ràng buộc Supervới Ctrlbạn bây giờ có thể sử dụng Super-Cđể sao chép hầu hết mọi nơi. Ngoại lệ phổ biến duy nhất là chương trình thiết bị đầu cuối của bạn. Tuy nhiên, bạn có thể xác định lại các phím tắt ở đó.

Tôi phát hiện ra rằng thậm chí còn gnome-terminalcó tùy chọn này cho đến bây giờ (tôi đã không có cho đến khi tôi quen với Ctrl-Shift-Cdù sao). Trong trường hợp bạn sử dụng cái đó, hãy Edit / Keyboard Shortcuts...vào menu và gán Ctrl-Cđể sao chép và Ctrl-Vdán. Nên tương tự cho konsolevv

Và đừng lo lắng, bạn sẽ không mất khả năng chấm dứt chương trình bằng phím tắt. Sau khi đóng lại phím tắt sao chép cho thiết bị đầu cuối, bạn chỉ có thể sử dụng Ctrl-Shift-Cnhư bạn đã sử dụng Ctrl-Ctrước đó. Thiết bị đầu cuối không phân biệt ở đây nếu nhấn Shift hay không. Và các phím tắt không bị bắt nữa cho bản sao. Thay vào đó, rebind chấm dứt sang một phím tắt khác, như MountainX gợi ý trong câu trả lời của anh ấy.


XF86Copy, vv không hoạt động

Liên quan đến các biểu tượng chính để sao chép và dán: Rõ ràng chúng không có tác dụng. Tôi đã kiểm tra nó một cách nhanh chóng bằng cách gán hành động sao chép cho Shift-ScrollLock (nó không được sử dụng và tôi muốn kiểm tra bằng một phím không sửa đổi):

xmodmap -e 'keycode 78 = Scroll_Lock XF86Copy Scroll_Lock'

Nhấn nó không có tác dụng, với XF86AudioMute. Tuy nhiên, nó đã hoạt động khi gán chữ 'a'. Vì vậy, tôi đoán có một vấn đề cụ thể với các ký hiệu khóa đặc biệt XF86 này.


3
Thật không may, ngay cả khi tôi liên kết Super với Ctrl, tôi vẫn sẽ phải sử dụng Ctrl / Super + Shift + C để sao chép và dán bên trong thiết bị đầu cuối, đây là một ưu đãi chính. Cảm ơn xác nhận rằng các phím XF86 không hoạt động.
solo

Bạn sử dụng chương trình thiết bị đầu cuối nào? Tôi đã thêm một giải pháp hoạt động với gnome-terminal ít nhất. Và nó nên tương tự cho những người khác.
zpea

4
Binding Control to Meta không giống như phím tắt thay đổi để sao chép / dán vào Meta + c / v. Tôi muốn tạo MacOs giống như các phím tắt trên Linux, vì vậy câu trả lời này không phải là tuyệt vời ...
Sonique

1
Shift + ctrl + c hoặc bất cứ điều gì quá vụng về và chỉ cần đảo ngược Super thành Ctrl sẽ gửi tín hiệu tiêu diệt bằng Super + c để không thực sự giải quyết được nhiều như vậy
rien333

Bước đầu tiên là xấp xỉ những gì tôi đã làm để biến super / lệnh thành kiểm soát. Điều đó sửa hầu hết mọi thứ - nhưng tôi vẫn muốn cmd-c và ctrl-c có các chức năng khác nhau, ngay cả khi cmd có nghĩa là ctrl ở nơi khác. Không chắc chắn nếu tôi có thể làm điều này với xmodmap và các phím tắt dành riêng cho thiết bị đầu cuối.
tedder42

9

Nếu bạn muốn liên kết chỉ một vài chuỗi có dạng Super + x, Super + c, Super + v với các chuỗi khác như Ctrl + x, Ctrl + c, Ctrl + v, ví dụ như (như OP mong muốn) Các chuỗi Super-key cụ thể thường sẽ ánh xạ để cắt và dán mà không ảnh hưởng đến bất kỳ việc sử dụng nào khác của Super key trên hệ thống của bạn, có thể chỉ sử dụng tiện ích mở rộng XKB. Quy trình dưới đây phác thảo các bước và đưa ra hai ví dụ khác nhau về các chi tiết cho hai thiết lập bàn phím bắt đầu khác nhau; hy vọng rằng sẽ cung cấp đủ thông tin để thích ứng với hệ thống của bạn. Nó giả định rằng bạn cảm thấy thoải mái với việc tạo và chỉnh sửa các tệp trên hệ thống của mình, bao gồm các tệp ở các vị trí hệ thống như thế nào /usr/share/X11/xkb.

  1. Quyết định nơi bạn muốn cây cấu hình XKB của bạn cư trú. Đầu tiên tìm hệ thống một. Nó thường là trong / usr / share / X11 / xkb, và tôi không chắc chắn làm thế nào để tìm thấy nó nếu nó không ở đó; bạn chỉ có thể tìm kiếm hệ thống của bạn cho các thư mục có tên "xkb". Dù sao đi nữa, khi bạn đã tìm thấy nó, bạn có thể sửa đổi hệ thống tại chỗ hoặc bạn có thể sử dụng bất kỳ thư mục nào bạn chọn. Ưu điểm của việc sử dụng thư mục hệ thống là bạn có thể dễ dàng gọi ra các thay đổi của mình hơn, nhưng nhược điểm là các bản cập nhật hệ thống trong tương lai có thể ghi đè lên các thay đổi của bạn (bạn đã được cảnh báo). Trong mọi trường hợp, tất cả các tên tệp được đề cập sau đây đều liên quan đến thư mục này, mà tôi sẽ đề cập đến khi cần là $ XKBLOCAL $ và tất cả các lệnh đều cho rằng đó là thư mục hiện tại của bạn.

  2. Xác định "loại" XKB của khóa nào các khóa x, c, v hiện tại. Cách dễ nhất để làm điều này là thông qua lệnh xkbcomp -a $DISPLAY - | grep -C 6 c,(lưu ý dấu phẩy được cố ý đưa vào mẫu). Trong thiết lập ví dụ đầu tiên của tôi, điều này tạo ra:

    key <AB02> {
        type= "ALPHABETIC",
        symbols[Group1]= [               x,               X ]
    };
    key <AB03> {
        type= "ALPHABETIC",
        symbols[Group1]= [               c,               C ]
    };
    key <AB04> {
        type= "ALPHABETIC",
        symbols[Group1]= [               v,               V ]
    };
    key <AB05> {
    

    trong khi đó trong thiết lập ví dụ khác của tôi, nó tạo ra

    key <AB02> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               x,               X, approxeq,     dead_ogonek ]
    };
    key <AB03> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               c,               C, ccedilla,        Ccedilla ]
    };
    key <AB04> {
        type= "FOUR_LEVEL",
        symbols[Group1]= [               v,               V, squareroot,           U25CA ]
    };
    key <AB05> {
    

    Kết quả cuối cùng là trong ví dụ đầu tiên, các khóa có liên quan thuộc loại "ALPHABETIC" trong khi trong ví dụ thứ hai, chúng thuộc loại "FOUR_LEVEL". Tùy thuộc vào thiết lập bàn phím của bạn, bạn có thể thấy rằng chúng thuộc một số loại khác hoàn toàn. Trong phần tiếp theo, loại sẽ được gọi là $ TYPE $, mà bạn phải thay thế bằng chuỗi ALPHABETIC thực tế hoặc bất cứ điều gì trong các lệnh bên dưới.

  3. Tìm định nghĩa của $ TYPE $ và sao chép nó vào một tệp mới trong thư mục $ XKBLOCAL $ / type. Đây là một lệnh thực hiện điều đó : xkbcomp -a $DISPLAY - | grep -z -o 'type "$TYPE$" {[^}]*};' > types/cutpaste. Tên của tệp "cutpaste" mà tôi chọn là tùy ý, sử dụng bất kỳ tên nào bạn thích, nhưng lưu ý bạn sẽ phải tham khảo tệp này một cách nhất quán trong các bước sau. Trong thiết lập đầu tiên, tập tin này nhận được nội dung

    type "ALPHABETIC" {
        modifiers= Shift+Lock;
        map[Shift]= Level2;
        map[Lock]= Level2;
        level_name[Level1]= "Base";
        level_name[Level2]= "Caps";
    };
    

    và trong ví dụ khác, nó nhận được nội dung

    type "FOUR_LEVEL" {
        modifiers= Shift+LevelThree;
        map[Shift]= Level2;
        map[LevelThree]= Level3;
        map[Shift+LevelThree]= Level4;
        level_name[Level1]= "Base";
        level_name[Level2]= "Shift";
        level_name[Level3]= "Alt Base";
        level_name[Level4]= "Shift Alt";
    };
    
  4. Chỉnh sửa các loại tệp / cutpaste để thực hiện hai điều: thêm một lời mở đầu và postamble làm cho nó trở thành một mệnh đề XKB thích hợp, và thay đổi tên loại và định nghĩa loại để thêm một cấp do trình sửa đổi tạo ra tương ứng với Super. Bạn nên kiểm tra xem công cụ sửa đổi đó là gì trên hệ thống của bạn, có khả năng Mod4 như được sử dụng dưới đây. Các sửa đổi cần thiết phải được thể hiện rõ ràng từ hai phiên bản cuối cùng của loại / cutpaste, cụ thể là:

    default partial xkb_types "addsuper" {
        type "ALPHABETIC_SUPER" {
            modifiers= Shift+Lock+Mod4;
            map[Shift]= Level2;
            map[Lock]= Level2;
            map[Mod4]= Level3;
            map[Shift+Mod4]= Level3;
            map[Lock+Mod4]= Level3;
            level_name[Level1]= "Base";
            level_name[Level2]= "Caps";
            level_name[Level3]= "With Super";
        };
    };
    

    default partial xkb_types "addsuper" {
        type "FOUR_LEVEL_SUPER" {
            modifiers= Shift+LevelThree+Mod4;
            map[Shift]= Level2;
            map[LevelThree]= Level3;
            map[Shift+LevelThree]= Level4;
            map[Mod4]= Level5;
            map[Shift+Mod4] = Level5;
            map[LevelThree+Mod4] = Level5;
            map[Shift+LevelThree+Mod4] = Level5;
            level_name[Level1]= "Base";
            level_name[Level2]= "Shift";
            level_name[Level3]= "Alt Base";
            level_name[Level4]= "Shift Alt";
            level_name[Level5]= "With Super"';
       };
    };
    
  5. Sao chép các định nghĩa ký hiệu khóa được xuất ra bởi grep trong bước thứ hai vào biểu tượng / biểu tượng tệp mới thứ hai, và thêm phần mở đầu và postamble tương tự, và sửa đổi các định nghĩa để sử dụng các loại mới và thêm hành động vào định nghĩa để xử lý khóa mong muốn được sản xuất bởi các phiên bản Super. Kết quả của điều này trong hai ví dụ của chúng tôi là:

    default partial xkb_symbols "superversions" {
        replace key <AB02> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               x,               X, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               c,               C, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> {
            type[Group1]= "ALPHABETIC_SUPER",
            symbols[Group1]= [               v,               V, NoSymbol ],
            actions[Group1]= [      NoAction(),      NoAction(), RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    default partial xkb_symbols "superversions" {
        replace key <AB02> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [x,X,approxeq,dead_ogonek,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatX>,mods=Control,clearmods=Super)]
        };
        replace key <AB03> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [c,C,ccedilla,Ccedilla,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatC>,mods=Control,clearmods=Super)]
        };
        replace key <AB04> { 
            type[Group1]= "FOUR_LEVEL_SUPER",
            symbols[Group1]= [v,V,squareroot,U25CA,NoSymbol],
            actions[Group1]= [NoAction(),NoAction(),NoAction(),NoAction(),RedirectKey(key=<LatV>,mods=Control,clearmods=Super)]
        };
    };
    

    Lưu ý rằng trong ví dụ thứ hai, tôi đã vắt kiệt một số khoảng trắng (không đáng kể) để giữ độ dài dòng dưới một chút kiểm soát.

  6. Tìm tên của bộ quy tắc mà XKB hiện đang sử dụng. Điều đó thật dễ dàng, nó được hiển thị trong kết quả của setxkbmap -query. Trong trường hợp của tôi, đó là "evdev".

  7. Sao chép phiên bản hệ thống của quy tắc / evdev (hoặc bất kể tên bộ quy tắc của bạn là gì) vào $ XKBLOCAL $ / quy tắc / evdev và thêm quy tắc chỉ vào các tùy chọn chúng tôi đã tạo. Bạn có hai lựa chọn ở đây: bạn có thể sao chép tất cả evdev hoặc chỉ các phần đề cập đến kiểu bàn phím, bố cục, biến thể và (các) tùy chọn mà bạn đang thực sự sử dụng. Tất nhiên, nếu bạn đang sửa đổi các tệp hệ thống tại chỗ, bạn không cần thực hiện bất kỳ sao chép nào, chỉ cần chỉnh sửa.

    Trong trường hợp này, những gì được thêm vào là giống hệt nhau bất kể thiết lập bàn phím ban đầu, vì vậy chỉ có một ví dụ. Bạn tìm phần của tệp quy tắc bắt đầu bằng ! option = symbolsvà thêm một dòng cutpaste:super = +cutpastevào phần đó và bạn cũng tìm thấy phần của tệp quy tắc bắt đầu ! option = typesvà một dòng cutpaste:super = +cutpastecho phần đó.

  8. Sao chép phiên bản hệ thống của evdev.lst và thêm một dòng cho tùy chọn mới của bạn. Lưu ý rằng tên của tệp này chỉ đơn giản tương ứng với tên của tệp quy tắc có thêm .lst. Như trong bước trước, bạn có thể sao chép toàn bộ tệp hoặc chỉ phần được tham chiếu bởi mô hình, bố cục, biến thể và (các) tùy chọn bạn đang sử dụng. Bạn chỉ cần tìm phần của tệp này bắt đầu bằng ! optionvà thêm một dòng như thế này: cutpaste:super Add super equivalents of cut and paste operationsvào phần đó.

  9. OK, bây giờ tất cả các tập tin cấu hình được đưa ra. Nếu bạn đã sửa đổi các tệp hệ thống, bây giờ bạn có thể gọi tùy chọn mới của mình với setxkbmap -option cutpaste:super. Mặt khác, nếu không, bạn phải cho setxkbmap biết thư mục $ XKBLOCAL $ của bạn ở đâu. Tệ hơn nữa, máy chủ không biết thư mục đó ở đâu, và setxkbmap không (hoặc có lẽ không thể, vì cuối cùng máy chủ có thể đang chạy trên một máy khác) nói với nó. Vì vậy, bạn phải chuyển đầu ra của setxkbmap sang xkbcomp, đồng thời cho biết lệnh đó có thư mục $ XKBLOCAL của bạn. Dòng lệnh đầy đủ là do đó setxkbmap -I$XKBLOCAL$ -option cutpaste:super -print | xkbcomp -I$XKBLOCAL - $DISPLAY.

Hy vọng rằng điều này có ích / quan tâm đến ai đó, vì tài liệu / tài liệu tham khảo XKB dứt khoát tốt là khan hiếm. Một tài liệu tham khảo rất hữu ích là http://madduck.net/docs/extending-xkb/ .


Câu trả lời tuyệt vời. Điều này làm việc cho tôi trong 17.10
blockloop

Điều này không làm việc cho tôi trên Ubuntu 18.04. Kết quả đơn giản là các phím 'c', 'x' và 'v' không còn hoạt động. Tôi đã có thể khiến họ làm việc lại với setxkbmap -option. Thiết lập cục bộ của tôi gần giống với ví dụ FOUR_LEVEL ngoại trừ một số ký hiệu Group2, Group3 mà tôi đã bỏ ra khỏi tệp ký hiệu một phần để tệp của tôi trông giống như các ví dụ.
JinnKo

2

Đây là những gì tôi làm. Nó không phải là giải pháp tối ưu, nhưng tôi đã cố gắng đạt được giải pháp cuối cùng và không thể đến đó sau nhiều nỗ lực. Vì vậy, tôi đã giải quyết cho một cái gì đó đơn giản và nó hoạt động cho hơn 90% những gì tôi cần. Tôi có thể triển khai nó trên bất kỳ máy tính nào tôi truy cập (hoặc bất kỳ cài đặt Linux mới nào) trong vài phút. Thật là đơn giản.

Trong ứng dụng đầu cuối X, đặt tùy chọn phím tắt. Tôi đã làm điều này trong cả Gnome và KDE. Ví dụ, trong Konsole, đi tới Menu> Cài đặt> Cấu hình phím tắt. Có một menu tương tự trong thiết bị đầu cuối Gnome X. Chỉ cần chọn phím tắt (ví dụ: "sao chép") và nhập chuỗi khóa mong muốn.

Trong trường hợp các thiết bị đầu cuối sao chép và dán các phím tắt xung đột với các lệnh của thiết bị đầu cuối, cũng có một cách khắc phục dễ dàng. Ví dụ: nếu ai đó muốn sử dụng CTRL-C để sao chép (thì thiết bị đầu cuối X phù hợp với tiêu chuẩn CUA)?

Trong trường hợp đó, bạn có thể dễ dàng thay đổi các ràng buộc khóa stty (trong .bashrc). Tiếp tục CTRL-C cho ví dụ sao chép, giả sử bạn muốn khóa ngắt bây giờ là CTRL-b (đối với "break"). Điều này thực hiện rằng:

echo "stty intr \^b" >> ~/.bashrc 

Sau đó, nguồn .bashrc.

Toàn bộ giải pháp đơn giản như sử dụng cài đặt đầu cuối X để thay đổi phím tắt và sau đó, tùy ý, giải quyết xung đột với stty bằng lệnh echo một dòng. Chết đơn giản và bao gồm hầu hết mọi thứ tôi cần.


0

Có lẽ khóa Windows là khóa bổ trợ. chạy cái này và thử lại:

xmodmap -e 'remove Mod4 = Super_L'

Cảm ơn, nhưng không làm được. Tôi biết ánh xạ là hoạt động vì xev báo cáo các sự kiện XF86.
solo

Bài viết đầu tiên của tôi (thực hiện xmodmap -e 'remove Mod1 = Meta_L'và thử các lệnh của bạn sau) hoạt động tốt với tôi.
ussr

1
@solo và về làm việc hay không, xem xét không phải mọi môi trường máy tính để bàn hoặc ứng dụng đều hỗ trợ chúng. Để tìm hiểu xem nó có thực sự hoạt động hay không, hãy sử dụng chúng trên Firefox chẳng hạn. Nó hỗ trợ (nghe) các ràng buộc phím X.
ussr

0

Tôi đã lấy một số điều mà Glen Whitney đã nói và quản lý để sử dụng kiến ​​thức đó để ánh xạ hành vi thao tác văn bản hoặc tệ hơn từ macOS vào một sơ đồ tùy chỉnh.

Tôi đã giải quyết vấn đề sao chép và dán Ctrl vs Super mà không liên quan đến giải pháp cụ thể đó, nhưng như tôi đã nói nó rất hữu ích cho những việc khác. Tôi cũng đã tránh những thứ như xmodmap vì tôi đang nhắm đến việc hỗ trợ đầy đủ Wayland vào một lúc nào đó. Kinto sử dụng xkb bản địa và nó tôn trọng macOS dự kiến ​​như hành vi của thiết bị đầu cuối.

https://github.com/rbreaves/kinto

https://medium.com/@benreaves/kinto-a-mac-inspired-keyboard-mapping-for-linux-58f731817c0

Đây cũng là một Gist, nếu bạn chỉ muốn xem những gì là trung tâm của tất cả, nó sẽ không thay thế sơ đồ bàn phím của bạn khi cần thiết. Gist cũng không bao gồm các tệp sơ đồ bàn phím xkb tùy chỉnh để thiết lập các con trỏ kiểu macOS / các thao tác từ thông minh sử dụng Cmd và các phím mũi tên.

https://gist.github.com/rbreaves/f4cf8a991eaeea893999964f5e83eebb

nội dung chính

# permanent apple keyboard keyswap
echo "options hid_apple swap_opt_cmd=1" | sudo tee -a /etc/modprobe.d/hid_apple.conf
update-initramfs -u -k all

# Temporary & instant apple keyboard keyswap
echo '1' | sudo tee -a /sys/module/hid_apple/parameters/swap_opt_cmd

# Windows and Mac keyboards - GUI (Physical Alt is Ctrl, Physical Super is Alt, Physical Ctrl is Super)
setxkbmap -option;setxkbmap -option altwin:ctrl_alt_win

# Windows and Mac keyboards - Terminal Apps (Physical Alt is Super, Physical Super is Alt, Physical Ctrl is Ctrl)
setxkbmap -option;setxkbmap -option altwin:swap_alt_win

# If the hid_apple driver is not loaded for Apple keyboards, which can be found out
# by the lsmod command then the above setxkbmap commands will not work
# Use the following commands for Apple style keyboards without an hid_apple driver
#
# Note: this could also apply to hid_apple driver as well 
# if this option is set to 0 inside swap_opt_cmd
#
lsmod | grep hid_apple

# Apple keyboard without hid_apple - GUI
setxkbmap -option;setxkbmap -option ctrl:swap_lwin_lctl,ctrl:swap_rwin_rctl

# Apple keyboard without hid_apple - Terminal
setxkbmap -option;setxkbmap -option altwin:alt_super_win

#
# If you want a systemd service and bash script to help toggle between
# GUI and Terminal applications then look at project Kinto.
# https://github.com/rbreaves/kinto
#
# Note: The above may not work for Chromebooks running Linux, please look
# at project Kinto for that.
#
# If anyone would like to contribute to the project then please do!
#
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.