Chuỗi tiền tố / thoát ít xung đột nhất cho màn hình hoặc tmux là gì?


96

Màn hình đi với Ctrl+ A. Mặt khác, tmux được phát triển trong màn hình sử dụng Ctrl+ B. Tuy nhiên, cả hai tổ hợp phím cũng được sử dụng trong trình soạn thảo, trình bao, v.v. Do đó, việc chọn một trong hai làm giảm trải nghiệm người dùng và chức năng của các công cụ đó khi được sử dụng trong tmux hoặc màn hình.

Tiền tố nào mâu thuẫn ít nhất với các tổ hợp phím và chương trình khác?


6
"cái nào mâu thuẫn ít nhất với các chương trình khác?" không có gì để làm với ý kiến.
iconoclast

Sau khi thay đổi, ~/.tmux.confđừng quên khởi động lại máy chủ tmux để các thay đổi có hiệu lực ( superuser.com/q/188491/105108 ).
ks1322

Thay thế cho việc sử dụng tiền tố: Một số thiết bị đầu cuối hiện cung cấp tích hợp tmux thông qua "tmux -CC" (tức là iTerm2 cho macOS). Bằng cách đó, các cửa sổ tmux xuất hiện dưới dạng các tab trong thiết bị đầu cuối. Sau đó, bạn có thể sử dụng các ràng buộc chính để quản lý các tab không xung đột với bất kỳ chương trình đầu cuối nào, tức là bằng cách sử dụng phím cmd (còn gọi là siêu khóa, phím windows).
cjay

Câu trả lời:


48

Tôi nghĩ ^\(aka ^|) là tốt nhất nếu nó ở vị trí thuận tiện trên bố trí bàn phím của bạn. Việc sử dụng nó trong các chương trình khác là khá hiếm:

  • gửi SIGQUITđến một quá trình
  • hủy bỏ hoặc trong khi các vòng lặp trong vỏ khi ^Cbị chặn
  • toggle-input-method trong emacs

Tôi không biết sử dụng bất kỳ khác. Hãy cẩn thận để không vô tình giết chết một quá trình bên ngoài tmuxhoặc screensau khi làm quen với nó. Nó chỉ xảy ra với tôi một lần trong một vài năm.

~/.tmux.conf

unbind-key C-b
set -g prefix 'C-\'
bind-key 'C-\' send-prefix

~/.screenrc

escape ^|^|

Tôi đã thử điều này nhưng tmux phàn nàn về việc sử dụng C-`. Can I escape the `character bằng cách nào đó?
Jason

2
Chỉ cần cho người khác biết, bạn nên viết 'C-\'thay vì `C- \` trong cấu hình tmux.
gns-ank

2
Đừng quên 'tmux source-file /path/to/tmux.conf' khi hoàn tất để thử các cài đặt mới
user72923

12
nhưng sau đó tôi có thói quen sử dụng lệnh đó và khi tôi quên tôi đang ở trong màn hình, tôi bắt đầu vô tình gửi SIGQUITs ...
Kache

3
"nếu nó ở vị trí thuận tiện trên bố trí bàn phím của bạn" theo mặc định thì không, bạn có ngụ ý rằng có một số ánh xạ lại phổ biến mà bạn đang sử dụng, điều này làm cho C- \ thuận tiện?
cốt truyện

53

Đối với những người muốn sử dụng backtick làm lối thoát trong tmux, bạn sẽ muốn thêm:

unbind C-b
set -g prefix `
bind-key ` send-prefix

Cái cuối cùng đó rất quan trọng, nếu không bạn không thể gõ backtick cho các mục đích khác :-)


Backtick có vẻ là một ý tưởng hay cho đến khi bạn dán vào một số SQL ...
Synchro

3
@Synchro trên tmux 1.8 không còn là vấn đề nữa nhờ tùy chọn giả định thời gian dán được bật theo mặc định (được đặt thành 1ms). Xem tại đây: sourceforge.net/p/tmux/tmux-code/ci/
mẹo

Tôi tìm thấy câu hỏi này để tìm giải pháp thay thế cho backtick vì nó bắt đầu gây rắc rối sau khi tôi quen với việc sử dụng backticks thay vì $()trong shell. Ngoài ra, nó trở thành một nỗi đau khi bạn bắt đầu viết nhiều Markdown. Tôi đã sử dụng nó được vài năm, nhưng tiếc là tôi sẽ phải thay đổi nó ngay bây giờ.
kirelagin

4
Trong .tmux.conf tôi cũng có bind-key C-a set-option -g prefix C-a. Bất cứ khi nào tôi cần sử dụng backticks, tôi nhấn vào `-Ctrl-ađó đặt tiền tố của tôi thành C-a. Và tôi có bind-key C-b set-option -g prefix `để tôi có thể đánh C-a-C-bđể quay trở lại
Boris

Nếu bạn đang viết markdown thì sao? Làm thế nào để bạn thoát khỏi tiền tố?
OJFord

21

Ctrl + A cũng được biết là gây ra sự cố với Emacs, bao gồm Bash trong chế độ Emacs. Có vẻ như đây không phải là một vấn đề cho bạn.

Ctrl + O là tùy chọn khác mà tôi đã thấy. Một cách thận trọng, đây là mặc định trong RatPoison (đây là trình quản lý cửa sổ X không cần chuột). Tôi đã sử dụng Ctrl + O khi sử dụng màn hình lồng nhau: Ctrl + O cho màn hình bên ngoài và Ctrl + A cho màn hình bên trong. Làm việc tốt, nhưng hơi sợ đồng nghiệp của tôi. :-)

Tôi chỉ nghĩ và nếu bạn sử dụng vi chứ không phải Emacs, có một vài lựa chọn thay thế. Ctrl + G không được sử dụng nhiều, chẳng hạn.


8
Đối với người dùng Emacs, Ctrl + O dường như là lựa chọn tốt nhất: Trong emacs, nó chỉ "mở một dòng mới tại con trỏ" và trong bash "lặp lại một chuỗi lệnh".
Lưu lượng

2
+1 nếu bạn ổn với các thao tác ctrl thuận tay phải, đây có vẻ là một bản sao lưu tốt. Bản thân tôi là một kẻ bất chính ;-)
DaveParillo

9
Tôi nghĩ rằng Ctrl + O phá vỡ vim
Mu Qiao

14
Tôi đồng ý với @MuQiao. Ctrl-o được sử dụng trong Vim để chuyển đến vị trí con trỏ cũ hơn (tương đương với nút quay lại trong nhiều IDE), một tính năng tôi sử dụng rất thường xuyên khi duyệt mã trong Vim. Ctrl-b đồng nghĩa với PageUp trong Vim. Tôi hoàn toàn không sử dụng Ctrl-b trên Vim. Vì vậy, đối với người dùng Vim như tôi, Ctrl-b vẫn là lựa chọn tốt hơn Ctrl-o. Tôi sử dụng Cj làm khóa tiền tố của mình vì Cj đồng nghĩa với j hoặc <Down> trong Vim và không ai sử dụng Cj để di chuyển xuống một dòng trong Vim. Tôi có cái này trong ~ / .tmux.conf:set -g prefix2 C-j; bind-key C-j send-prefix -2
Susam Pal

C-jxung đột với CtrlP. Di chuyển lên và xuống danh sách bộ đệm sử dụng C-kC-jtương ứng
blockloop

14

Tôi đã có CAPS-LOCKbản đồ toàn cầu ESC. Sau đó, tôi sử dụng M-Space(tức là CAPS-LOCK+ Space) cho tiền tố của mình.


Tôi đang cố gắng để làm điều này nhưng nếu tôi giữ CAPS-LOCK(nghĩ về lệnh tiếp theo của tôi hoặc một cái gì đó) tmux, hoặc iTerm, không chắc điều gì gây ra điều này đã nhận ESClệnh liên tục khiến M-Spacenó không hoạt động. Có cách nào để vô hiệu hóa vấn đề chính lặp đi lặp lại? Chẳng hạn, nó hoạt động khi tôi nhấn nhanh CAPS-LOCK + Space, nhưng không phải nếu tôi giữ CAPS-LOCKmột giây hoặc lâu hơn thì nhấn Spacenó không đăng ký M-Spacehợp âm ...
Bruno Ely

12

Tôi sử dụng một hệ thống phức tạp cho màn hình. Lối thoát mặc định của tôi được đặt thành \ 140 \ 140, đó là backtick. Ctrl-A làm phức tạp cả Emacs và chỉnh sửa dòng lệnh cho tôi trong Zsh và tôi không thích Ctrl-O (2 thao tác tay cho hầu hết các hành động trên màn hình).

Tôi bật lại màn hình 1 để các phiên mới được tạo từ trái sang phải trên bàn phím bắt đầu từ 1. Điều này cho phép tôi đặt trước màn hình 0 cho những gì tôi cho là các cửa sổ tham chiếu hoặc liên tục. Đó là một cử chỉ rất nhanh với (backtick) 1, (backtick) 2, (backtick) 3 để trao đổi giữa các cửa sổ.

Vấn đề với việc sử dụng backtick trong môi trường unix là khi cố gắng cắt và dán mã script shell / perl. Vì lý do này, tôi bindkey F11 / F12 để chuyển giữa nhân vật thoát của tôi.

bindkey -d -k F1        escape ^O^O # bound to F11
bindkey -d -k F2        escape \140\140 # bound to F12

Điều này sẽ hoán đổi lối thoát sang Ctrl-O khi tôi thực hiện các thao tác cắt và dán. Tôi thấy việc đánh dấu hai lần rất đơn giản và đánh đổi tốt cho hầu hết các thao tác trên màn hình.

Xem lại câu trả lời này bằng một giải pháp mới hơn cho phép chuyển đổi chế độ bằng cách nhấn F12 và sử dụng chú thích để chỉ ra chế độ.

## command characters
escape \140\140                 # default is `

## sets caption and escape toggle
bindkey -d -k F2 process a     # bound to F12

## initial caption
caption always '%{= kW}%?%F%{+b KW}%:%{= kK}%? %= %?%F%{-b .c}>>>%{-}%? | %-w%{mW}%n* %t%? @%u%?%{-}%+w '

## registers to toggle bindkeys
register a "\140:eval 'bindkey -d -k F2 process b' 'process c' 'escape \\017\\017'^M"
register b "\017:eval 'bindkey -d -k F2 process a' 'process d' 'escape \\140\\140'^M"

## registers to change captions
register c "\140:caption string '%{= kW}%?%F%{+b mW}%:%{= kK}%? %= %?%F%{.c}ALT%{-}%? | %-w%{KW}%n* %t%? @%u%?%{-}%+w '^M"
register d "\017:caption string '%{= kW}%?%F%{+b KW}%:%{= kK}%? %= %?%F%{.c}>>>%{-}%? | %-w%{mW}%n* %t%? @%u%?%{-}%+w '^M"

Giải pháp sáng tạo. Tôi rất ấn tượng.
staticsan

bind-key -n F11 set -g prefix `bind-key -n F12 set -g prefix Co Updates for tmux trong trường hợp người khác muốn điều chỉnh điều này.
milkypostman

1
Có cách nào để đặt một số loại thời gian chờ tối thiểu cho tiền tố + combo_key khác trong tmux để khi dán mã, nó không kích hoạt bất kỳ lệnh nào nhưng khi gõ phím backtick + từ bàn phím thì vì thời gian tạm dừng giữa backtick và phím kia dài hơn ?
ốm

11

Tôi sử dụng Ctrl-Qtrong tmuxvà nó đã làm việc tốt cho đến nay. Tuy nhiên, tôi phải đề cập rằng nó xung đột với kiểm soát dòng chảy vỏ. Theo mặc định, Ctrl-Qđược sử dụng để kích hoạt lại đầu ra sau khi dừng nó với Ctrl-S. Đã bị bất ngờ bởi một cái vỏ bị mắc kẹt một vài lần sau khi vô tình va vào Ctrl-S, tôi đã học được cách không nhấn Ctrl-S.

(Người ta cũng có thể tắt điều khiển luồng hoàn toàn với stty -ixonhoặc liên kết các khóa khác nhau với stty startstty stop.)

# tmux.conf
unbind C-b
set -g prefix C-q

Tôi đã áp dụng ràng buộc này và tôi thấy nó rất thuận tiện. Cảm ơn!
aymericbeaumet

Yêu thích của tôi là tốt, vì tôi luôn vô hiệu hóa các công cụ điều khiển thiết bị đầu cuối.
Jack O'Connor

2
Được sử dụng trong emacs cho quote-inserted. Sử dụng mẫu (trong emacs): nếu tôi muốn tìm kiếm ký tự tab tiếp theo -<Ctrl-s>+<Ctrl-q>+<TAB>
nhed

6

Tôi thích dự trữ ^Spacecho các hoạt động rất đặc biệt / phổ biến vì tôi thấy đó là tiền tố dễ nhập nhất, nhưng hiện tại tôi đang thử nó được ánh xạ như là prefixtrong tmux .

Nó để ngón tay của bạn tự do nhảy ngay đến lệnh bạn muốn gõ. Hãy thử một lần.


3
Điều đó đã không tồn tại lâu - tôi trở lại ^ j. ^ Không gian quá giống với các lệnh mà tôi sử dụng để gọi các ứng dụng cấp OSX (Spotlight, QuickSilver, DTerm).
sân thượng

Tôi cũng dùng Cj. Đây là những gì tôi sử dụng trong ~ / .tmux.conf của mình:set -g prefix2 C-j; bind-key C-j send-prefix -2
Susam Pal

1
Tôi cũng sử dụng C-Space, nó không được sử dụng ở hầu hết các nơi khác.
mahdix

1
Không gian C là hoàn hảo đối với tôi, vì tôi đang ở trên Chromebook: D
Eric Nguyen

6

Một gợi ý muộn màng : ctrl-s. ctrl-scó một số lợi thế:

  1. Trên hàng nhà.
  2. Vẫn gần ctrl-a(trên thực tế, đối với hầu hết các máy đánh chữ, nó sẽ sử dụng cùng hai ngón tay mà họ đã sử dụng ctrl-a), do đó, bộ nhớ cơ chuyển từ ctrl-asang ctrl-slà tầm thường - đối với tôi, nó trở thành bản chất thứ hai trong khoảng một giờ kể từ lần đầu tiên thử nó.
  3. Giải phóng ctrl-acho các hoạt động "quay lại đầu dòng" theo kiểu emacs hoặc hoạt động "số tăng" theo kiểu vim. Hoặc hey, để chạy màn hình bên trong khung tmux mà không cần phải lo lắng về việc thoát các ký tự tiền tố để kiểm soát phiên bản màn hình nhúng. (Tôi thường làm điều này bằng cách sử dụng một tmux cục bộ với các bảng chứa các phiên ssh đến các máy chủ từ xa, trong đó tôi chạy màn hình)
  4. Không ghi đè hoặc thêm yêu cầu thoát cho bất kỳ chức năng đầu cuối thường được sử dụng khác. không có gì đại đa số mọi người sử dụng ngày nay là trên ctrl-s!

Tất nhiên, lý do không có gì trên ctrl-s là trong thiết bị đầu cuối, theo truyền thống, nó được sử dụng để kiểm soát dòng chảy, có từ thời trước khi các công cụ phân trang thích morelessphổ biến. Tôi chắc chắn rằng một số chương trình thiết bị đầu cuối GUI ở đâu đó vẫn có chức năng kiểm soát luồng được bật theo mặc định, nhưng tôi thực sự không bị va vào một; Các chương trình thiết bị đầu cuối gui mà tôi đã thử dường như hoàn toàn bỏ qua nó theo mặc định, điều này làm cho sự kết hợp phím thuận tiện đó có sẵn để sử dụng hiệu quả hơn.

Vì vậy, nếu bạn không thực sự sử dụng màn hình / tmux từ bên trong (ví dụ) một thiết bị đầu cuối Linux thô, mà là từ thiết bị đầu cuối dựa trên GUI, thì tôi khuyên bạn nên ctrl-sdùng thử; nó đã tạo ra việc nén trong tmux và màn hình thuận tiện hơn rất nhiều cho tôi.


4
Ctrl-s là tìm kiếm chuyển tiếp, khi tôi đi xa bằng Ctrl-r :)
Jack O'Connor

Ctrl-S là phổ biến để dừng đầu ra giao diện điều khiển (còn gọi là "đóng băng" nó). Điều này cắn tôi khi tôi cố gắng ánh xạ lại nó.
Dave

5

Một khóa không có xung đột có thể được C-z, vì nó thường được sử dụng để gửi chương trình xuống nền để tiếp tục một thứ khác trên shell đã khởi động nó. Tôi không làm điều này khi tôi có tmux.


Vấn đề duy nhất tôi gặp phải khi sử dụng Cz là hầu hết những người khác đang sử dụng Cb, vì vậy bộ nhớ cơ của tôi bị tắt khi lập trình cặp trên máy của người khác. Cuối cùng tôi phải chạy fgrất nhiều sau khi gõ nhầm Cz.
Steve Jorgensen

Suy nghĩ tuyệt vời về Cz là, giả sử bạn không muốn sử dụng Ca, nó rất gần với phím Ctrl bên trái, đây là phím điều khiển duy nhất trên hầu hết các bàn phím máy tính xách tay hiện nay. Cũng gần với Caps Lock nếu bạn đã ánh xạ tới Ctrl. Tôi ánh xạ Caps Lock của mình sang Esc vì tôi thường sử dụng bàn phím Kinesis Freestyle Solo có phím Esc ở một nơi khó xử.
Steve Jorgensen

4

Tôi đã nghe nói về `(backtick) đang được sử dụng và sau đó bạn chỉ cần gõ nó hai lần cho một backtick thực tế. Có thể tốt hơn cho người dùng vi đã quen với hành động (trừ khi bạn thực hiện thao tác khóa Caps).


Làm thế nào bạn có thể xác định backtick cho tmux?
Alexandre Nizoux

Một cái gì đó như: hủy liên kết Cb; đặt tiền tố -g '' tiền tố '; bind 'gửi; xem câu trả lời của Darren Hall ở trên.
bluehavana

Tôi bị backtick khoảng một năm và tôi sẽ không bao giờ quay lại tiền tố hai khóa / kết hợp. Hãy thử một lần.
ốm

4

Tôi khuyên bạn C-jkhông nên can thiệp nhiều vào vi hoặc emacs. Về cơ bản, tôi đồng ý với một nhận xét của Susam Pal, có vẻ xứng đáng để hiển thị như một câu trả lời, vì những người khác dường như có những xung đột đáng kể từ quan điểm của tôi.

Tôi sử dụng Cj làm khóa tiền tố của mình vì Cj đồng nghĩa với j hoặc trong Vim và không ai sử dụng Cj để di chuyển một dòng xuống trong Vim. Tôi có cái này trong ~ / .tmux.conf:

set -g prefix2 C-j; bind-key C-j send-prefix -2


1
Dựa trên đề xuất của bạn, tôi đã sử dụng Cj được một thời gian và xung đột duy nhất tôi tìm thấy là với plugin CtrlP vim. Cj và Ck được sử dụng để di chuyển xuống và lên các tùy chọn tương ứng.
blockloop

3

Đối với bố trí bàn phím Lập trình Dvorak, sẽ khá gọn gàng khi sử dụng phím trừ (dấu gạch ngang) làm tiền tố, tức là ctrl+ -.
Phím trừ nằm ở vị trí phím trích dẫn đơn trong bố cục qwerty. Ngoài ra, tôi có chức năng khóa phím là khóa ctrl. Sau đây là một tmux conf, để đặt nó làm tiền tố:

unbind C-b
set -g prefix C-_
bind C-_ send-prefix
bind - last-window

Bạn có thể tự hỏi, tại sao dấu gạch dưới được sử dụng thay vì trừ? Tham khảo Tmux: làm cách nào để liên kết với Cv (kiểm soát-trừ)?
Đối với qwerty, bạn có thể áp dụng Làm cách nào để liên kết khóa tiền tố tmux với C- '? giải pháp, để giữ lại cùng một phím tắt.

Tôi muốn nói rằng đây là một tiền tố hoàn hảo nếu bạn sử dụng Vim / Neovim. Bởi vì các tiền tố, chẳng hạn như ctrl+ ahoặc ctrl+ b, làm bóng (chồng chéo) chức năng của Vim, theo bất kỳ cách nào.


2

Cá nhân, bchỉ là quá xa đối Ctrlvới tôi. Khi tôi sử dụng tmux, tôi luôn thay đổi liên kết từ Cb sang Ca. Xung đột chính với Ca là chọn tất cả, nhưng tôi không thấy đây là vấn đề với các chương trình tôi sử dụng tmux.


thực vậy, tôi sử dụng mặc định (trong màn hình, chưa bao giờ thử tmux) và chưa thấy cần phải thay đổi nó.
quack quixote

2

Là một người dùng GNU emacs, zsh và MS Windows, tôi sử dụng Control-T. (ví dụ: trong .screenrc :)

thoát "^ T ^ T"

Có Control-T có một cái gì đó ràng buộc với nó, như menu kéo xuống trong khả năng của Ubuntu hoặc nhân vật chuyển vị trong Emacs.

Tôi coi thường Co vì nó đòi hỏi hai tay cho tôi.


2

Tôi nghĩ giải pháp tốt nhất là ^ C. Emacs sử dụng ^ C làm khóa tiền tố và tôi thấy rằng khi tôi cần nhập ^ C trong một vỏ tôi hầu như luôn luôn gõ hai. :-)

unbind-key C-b
set -g prefix C-c
bind-key C-c send-prefix


1

Bạn có thể sử dụng backtick. Một số phiên bản cũ hơn của tmux không hỗ trợ backtick, do đó bạn có thể thực hiện các cách sau để khắc phục (điều đó sẽ thêm C-`, C- @ và C-space làm meta của bạn cùng một lúc):

# meta prefix - @ - backtick
unbind C-b
set -g prefix C-@
bind C-@ send-prefix
bind C-@ last-window

Tôi thường ánh xạ lại CapsLock của mình sang Ctrl, vì vậy nó càng có ý nghĩa hơn với backtick.


Tôi sử dụng điều này là tốt. C-Space khá dễ gõ.
kzh

Backtick là khá tốt. Tuy nhiên, nó không thân thiện với thiết bị đầu cuối. Bạn chắc chắn không thể sai với xterm trên linux, nhưng các thiết bị đầu cuối như putty và iTerm2 (macos) có vấn đề mô phỏng đúng. May mắn thay trong iTerm2, bạn có thể giải quyết nó trong cấu hình. Tôi không sử dụng windows / putty rất nhiều, vì vậy không gian ctrl dường như là một cách giải quyết khả thi. :)
Alex

1

Hầu hết các câu trả lời ở đây sử dụng Ctrl như một phần của tổ hợp phím.
Khi tôi sử dụng Ctrl, ngón tay ngón út của tôi bắt đầu đau vì tôi luôn phải trải nó xuống Ctrl.
Tôi sử dụng Alt-jcái mà tôi gõ bằng ngón tay cái trái và ngón trỏ phải của tôi và nó rất tiện lợi. Tôi cũng không tìm thấy bất kỳ va chạm với bất kỳ chương trình nào khác cho đến nay.

unbind C-b
set-option -g prefix M-j

1

Đối với màn hình GNU, ánh xạ backtick để thoát, phần sau trong ~ / .screenrc hoạt động với tôi.

escape ``

0

Tôi thích đề xuất ràng buộc ctrl- \ làm tiền tố , nhưng để làm cho nó hoạt động trên Linux Mint 12, tôi đã phải thoát khỏi vị trí liên kết ở phía dưới. Nếu không, nó sẽ không mất. Xem .tmux.conf của tôi tại đây: Sử dụng tmux với cả emacs và vim


Vui lòng không tham khảo câu trả lời là "ở trên" và "bên dưới" vì thứ tự có thể thay đổi. Liên kết câu trả lời thay thế. Cảm ơn câu trả lời của bạn :)
Flow

0

Tôi nghĩ rằng người dùng Mac sẽ thấy §thuận tiện hơn backtick.

Trên bàn phím không phải máy Mac , backtick được định vị ở cùng phím với §bàn phím trên máy Mac. Vì vậy, để trải nghiệm sự tiện lợi giống như những người đề xuất sử dụng backtick, hãy sử dụng ký hiệu đoạn trên bàn phím Mac.

Sử dụng backtick trên bàn phím Mac rất khó khăn vì nó nằm rất gần dịch chuyển trái (⇧), điều khiển (⌃) và (⌥) phím alt. Trên MacBook thậm chí gần phím trái fn.


Xác định bàn phím Mac ;-)
Arjan

Được rồi, bạn có một điểm ở đây, tôi có nghĩa là bố trí bàn phím Apple Mac US, mặc dù bất kể bàn phím macbook mở rộng đầy đủ.
nanitous
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.