Visual Studio: скорочений ключ Ключ: Дублікат лінії


423

Чи є ярлик для команди дублювання рядків у Visual Studio 2008?

Кілька подібних прикладів:


6
Щодо інформації, одна з багатьох переваг, які пропонує ReSharper - це можливість це зробити.
AakashM

2
visualstudiogallery.msdn.microsoft.com/… Завантажте це, а Alt + D повторить ваш вибір, або якщо нічого не буде виділено, він буде дублювати весь рядок. На жаль, візуальні базові макроси, здається, не працюють у 2013 році, лише js макроси.
shenk

1
OMG, в чому проблема присвоєння такої людини, як дублювання рядків ??? Я звик до затемнення. І Ctrl + D призначений для видалення рядка. Чому це так складно у VS ???
Андрій Музичук

2
@mghhgm нижче - відповідь, яку ви шукаєте. (shift + alt + вниз або зсув + alt + вгору)
Віктор Баррантес

1
Приклад vim не дублюється, це ctrl + c; ctrl + v. "Yank" ріже, а p вставляє. Це не зовсім так, як інші приклади.
ANeves

Відповіді:


406

У Visual Studio 2019

Ctrl + D

У Visual Studio 2017 (v15.6 і пізніше)

Ctrl + D

У Visual Studio 2017 (до v15.6)

(редагувати) Ця функція тепер вбудована у VS2017: Ctrl+E , Vдублює рядок, якщо нічого не вибрано, або вибір дублікатів. Ви можете призначити її іншій комбінації клавіш або знайти її в меню:

Дублікат рядка у VS2017

Додаткову інформацію див. У цій посиланні .

Попередньо VS2017, вбудований метод за допомогою буфера обміну

Як згадував @cand, ви можете просто зробити Ctrl+ C;Ctrl+ V.

Ctrl + C скопіює рядок, якщо нічого не вибрано.

Рішення макросу (до VS2017)

Якщо ви хочете реалізувати більш повне рішення, можливо, створити більш простий ярлик клавіатури, або ви не хочете створювати буфер обміну, див. Цей посібник:

Копіювати дублюючу лінію для Visual Studio

Visual Basic:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module DuplicateLastLineModule
    Sub DuplicateLine()
        Dim line As String
        DTE.ActiveDocument.Selection.StartOfLine(0)
        DTE.ActiveDocument.Selection.EndOfLine(True)
        line = DTE.ActiveDocument.Selection.Text
        DTE.ActiveDocument.Selection.EndOfLine()
        DTE.ActiveDocument.Selection.NewLine()
        DTE.ActiveDocument.Selection.StartOfLine(0)
        DTE.ActiveDocument.Selection.Text = line
    End Sub
End Module

Щоб створити макрос, просто перейдіть до Explorer Explorer ("Інструменти-> Макроси-> Макропровідник" або Alt+ F8) та скопіюйте вставити код у новий модуль. Тепер просто призначте для неї комбінацію клавіш:

  1. перейдіть до Інструменти-> Опції ...
  2. у розділі "Навколишнє середовище" натисніть Клавіатура
  3. у текстове поле "Показати команди, що містять" введіть "дублікат" (це відповідно до імені, яке ви дали модулю.)
  4. тепер ви повинні побачити макрос у списку нижче
  5. виберіть "Редактор тексту" зі списку "Використовувати новий ярлик в"
  6. встановіть фокус у текстовому полі "Натисніть клавіші швидкого доступу" та натисніть комбінацію на клавіатурі, яку ви хочете використовувати для цього ( Ctrl+ Shift+D у моєму випадку)
  7. натисніть кнопку "Призначити"
  8. тепер ви повинні побачити ярлик у текстовому полі "Ярлики для вибраної команди"
  9. натисніть кнопку ОК

І це все. Насолоджуйтесь!


3
Я просто спробував його, і це цікаво , що він повторює деякі додаткові символи , коли є «блок коду на стороні сервера» з короткими позначками, наприклад: <div>Profile.UserName: <%=Profile.UserName %></div>- після того, дублюючи цей рядок з допомогою цього макросу, стає наступним: <div>Profile.UserName: <%=Profile.UserName %></div> %></div>. Як бачите, остання частина "повторюється". Коли в ньому немає блоків коду стороні сервера, він працює добре. Чи знаєте ви вирішення цього питання? До речі, ще одна цікава річ, яку я пережив - це те, що цей макрос відносно "повільний", чого я не очікував ... :)
Sk8erPeter

6
Після лютого 2014 року макроси відключені з міркувань безпеки. Прокрутіть униз і подивіться відповідь MasterHD для вирішення способу отримати метод Ваеля, щоб продовжувати працювати навіть після оновлення безпеки.
MasterHD

4
Я вважаю, що Ctrl C + Ctrl V є обмежуючим у випадках, коли я вже скопіював щось у буфер обміну, і хотів би дублювати рядок перед тим, як вставити.
sawe

1
Чому на землі так важко здійснити повторювані дії чи прив'язку клавіш, що більшість інших редакторів роблять дуже ефективно та інтуїтивно. : /
kisanme

1
чому це потрібно. Я скопіював smth на іншу вкладку, я переходжу до конкретного рядка на цій вкладці, я дублюю рядок, а потім використовую <code> CTRL + V </code>, щоб вставити деякий код. ..
Август

136

Там в вільне розширення , яке ви можете скачати тут , що дозволяє вам повторювані рядки без заміни вмісту буфера обміну.

За замовчуванням його прив’язано до Alt+ D, але ви можете змінити його на все, що завгодно, перейшовши до Інструменти-> Опції-> Навколишнє середовище-> Клавіатура. Введіть "Копіювати" у вікні пошуку та знайдіть "Edit.DuplicateSelection" та відредагуйте ярлик до того, що вам потрібно. Я вважаю за краще Ctrl+ Dбути узгодженим з іншими редакторами.


23
Це справжня відповідь, яку ви шукаєте, все інше тут розміщено розумно, але тільки не те, що просили.
Ремко Бум

8
Edit.DuplicateSelectionяк видається, немає у VSE 2013. Або що-небудь інше із дублікатом терміна .
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ


2
Метью, ти повинен натиснути посилання ТУТ і встановити розширення. ЦІЛИ вам доведеться закрити візуальну студію та відкрити її знову. ТІЛЬКИ вам потрібно перейти до Інструменти ==> Опції ==> Навколишнє середовище ==> Клавіатура, а потім вам потрібно набрати копію, і ви побачите це. Тоді ви можете натиснути F4, щоб він діяв як QEDIT або все, що завгодно, і життя буде хорошим.
ggb667

Навіть якщо вам боляче встановити інший інструмент, цей робить свою роботу і робить це добре. Дякую !
Сб

94

Це просто Ctrl+ C; Ctrl+ V, перевірте це посилання . Поки ви не виберете жодного тексту, це буде дублювати рядок, курсор закінчується, коли ви натискаєте Ctrl+ C.


159
Існує чимало випадків, коли ви не хочете проходити через дошку для кліпів, наприклад, якщо ви хочете дублювати рядок, а потім замінити якийсь вміст у ньому на щось, що є у дошці кліпів.
Еффата

7
Звичайно, але в цьому питанні було задано ярлик, а не загальне рішення для редагування тексту, тому я вважаю, що для простих цілей цього достатньо (принаймні, у моєму випадку).
cand

4
дякую, але я очікував щось подібне на Ctrl + j в Edit Plus або Crtl + D в Notepad ++ ... чи є в VS2008 чи у VS2010
Posto

2
Я знайшов лише цю. Однак це не так вже й погано - звичайно простіше було б використовувати ctrl + D, але якщо ви хочете скопіювати 1 рядок у 100 копіях, ви можете це зробити за допомогою ctrl + c (не потрібно нічого вибирати, просто поставте командний рядок над потрібним рядком ) + 100 разів ctrl + v. Це лише один набір натискань клавіш більше, ніж рішення ctrl + d. Це може бути більш проблематично, якщо ви хочете зробити більш складне дублювання.
cand

@ Mason240 Це була моя первісна реакція і на цитовану частину прийнятої відповіді, однак додаткова інформація "Поки ви не виберете жодного тексту, це повторить рядок курсору над ..." робить це ідеальним рішення в моєму випадку.
RyanfaeScotland

74

Ctrl+ C+ Vпрацює на VS2012 без розширення.


Працює і на VS2008!
теодрон

1
Працює у VS2017.
Кайл Делані

8
Потрібно рішення без перезапису буфера обміну
П'єр де ЛЕСПИНА

Тільки для доповнення відповіді, вам потрібно лише натиснути повну комбінацію для першого дублювання. З другого просто натисніть Ctrl + V повторно стільки, скільки потрібно, щоб продовжувати реплікацію рядка.
Люти

34

Ctrl+ Dпрацює для мене в VS2012 з Resharper. Це гаряча клавіша Resharper.


11
ні його немає, тільки зрозумів, що після публікації, але це ярлик Resharper. і якщо на одному встановлено перерозподільник, це може допомогти.
sawe

1
Я перекроював, і не знав цієї ярлика! Дякую.
DanO

Це ярлик за замовчуванням, якщо ви використовуєте схему клавіатури Resharper "Resharper 2.x або IntelliJ IDEA". Resharper дозволяє вибрати карту клавіатури під час встановлення. Схема клавіатури "Visual Studio" - один із варіантів. Якщо ви виберете схему клавіатури "Visual Studio", тоді Ctrl + D буде відображено на щось інше.
GeoMac

Це відповідь на питання ReSharper.
Ентоні Бут

Зауважте, що це також працює, коли вибрано кілька рядків, тобто ви можете дублювати цілу купу коду, а не лише один рядок. Недоліком, звичайно, є те, що повторна реалізація не є безкоштовною (але, здається, світ NET звик до цього більше, ніж світ Яви, з якого я родом).
Амос М. Карпентер

31

У Visual Studio 2013 можна використовувати Ctrl+ C+V


2
Радий, що я прогулявся вниз. Це я хотів.
Дарил

Працює і над VS Code Linux.
Хань

4
Потрібно рішення, не перезаписуючи буфер обміну
Pierre de LESPINAY

2
Було б чудово, якби не перекреслив буфер обміну
mikus

23

Ось макрос, який базується на посиланні, розміщеному Wael, але вдосконаленому в наступних областях:

  • трохи коротше
  • трохи швидше
  • коментарі :)
  • поводиться для рядків, що починаються з "///"
  • можна відмінити одним скасуванням
Imports System
Imports EnvDTE
Imports EnvDTE80

Public Module Module1

    Sub DuplicateLine()
        Dim sel As TextSelection = DTE.ActiveDocument.Selection
        sel.StartOfLine(0) '' move to start
        sel.EndOfLine(True) '' select to end
        Dim line As String = sel.Text
        sel.EndOfLine(False) '' move to end
        sel.Insert(ControlChars.NewLine + line, vsInsertFlags.vsInsertFlagsCollapseToEnd)
    End Sub

End Module

1
Так, це насправді працює, один із прийнятих відповідей копіював випадкові речі в новий рядок. Приємна робота, дякую!
zuallauz

Я не знайшов опцію Макроси в VS 2010 Express, чи можна це реалізувати там?
Ненотлеп

1
Після лютого 2014 року макроси відключені з міркувань безпеки. Прокрутіть униз і подивіться відповідь MasterHD для вирішення способу, щоб отримати метод Марка, щоб продовжувати працювати навіть після оновлення безпеки.
MasterHD

11

Якщо вам подобається дублювання ліній (або блоків) стилів затемнення, використовуючи CTRL+ ALT+ UPабо CTRL+ UP+ DOWN, нижче я публікую макроси для цієї мети:

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports System.Diagnostics

Public Module DuplicateLineModule
    Sub DuplicateLineDown()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim lineNumber As Integer
        Dim line As String

        If selection.IsEmpty Then
            selection.StartOfLine(0)
            selection.EndOfLine(True)
        Else
            Dim top As Integer = selection.TopLine
            Dim bottom As Integer = selection.BottomLine

            selection.MoveToDisplayColumn(top, 0)
            selection.StartOfLine(0)

            selection.MoveToDisplayColumn(bottom, 0, True)
            selection.EndOfLine(True)
        End If

        lineNumber = selection.TopLine
        line = selection.Text

        selection.MoveToDisplayColumn(selection.BottomLine, 0)
        selection.EndOfLine()
        selection.Insert(vbNewLine & line)
    End Sub
    Sub DuplicateLineUp()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim lineNumber As Integer
        Dim line As String

        If selection.IsEmpty Then
            selection.StartOfLine(0)
            selection.EndOfLine(True)
        Else
            Dim top As Integer = selection.TopLine
            Dim bottom As Integer = selection.BottomLine

            selection.MoveToDisplayColumn(top, 0)
            selection.StartOfLine(0)

            selection.MoveToDisplayColumn(bottom, 0, True)
            selection.EndOfLine(True)
        End If

        lineNumber = selection.BottomLine
        line = selection.Text

        selection.MoveToDisplayColumn(selection.BottomLine, 0)
        selection.Insert(vbNewLine & line)
        selection.MoveToDisplayColumn(lineNumber, 0)
    End Sub
End Module

10

Чому так багато давно намальованих методів зробити щось таке просте? Щоб завантажити та встановити розширення від Microsoft, потрібно менше хвилини. На сторінці написано, що вона за замовчуванням прив’яже її до ALT+ D, але для мене вона автоматично прив’язує до CTRL+ Dу Visual Studio Community 2015 без будь-яких змін.

Ось посилання на завантаження розширення з Microsoft.com.


Питання про Visual Studio 2008, а не 2015 :)
sarcom

Слід зазначити, що це розширення дублює вибрані рядки, а не вибір. Але це все-таки корисно.
ANeves

Цей для мене найкорисніший, тому що я хотів рішення, яке не замінило те, що було в буфері обміну. Це розширення саме те, що я шукав. За словами автора розширення, наразі це працює для Visual Studio 2012, 2013, 2015 та 2017
Марк

8

У візуальному коді студії ( WebMatrix ):

Скопіюйте рядки вниз: Shift+Alt +down

Копіювати рядки вгору: Shift+Alt +up

Видалити лінії: Ctrl+ Shift+k


1
Це найкраща відповідь поки; це навіть дозволить вам дублювати повний блок коду - якщо так ви хочете - лише вибравши кілька рядків. Випробуваний у Visual Studio Code 1.7.2
Віктор Баррантес

7

Хоча я усвідомлюю, що це не комбінація клавіш, я зрозумів, що додам це, оскільки це не вимагає використання буфера обміну і може допомогти деяким людям.

Виділіть рядок, який потрібно дублювати. Натисніть клавішу управління, клацніть мишею по виділеному тексту та перетягніть туди, куди ви хочете піти. Це буде дублювати виділений текст.


Досягає такого ж результату завдяки вбудованій функціональності! І питання задало лише ярлик - не обов’язково комбінацію клавіш! Але все-таки було б приголомшливіше, якби миша не була задіяна.
DanO

7

Оскільки я не можу використовувати макроси у своїй Visual Studio 2013, я знайшов плагін Visual Studio (використовую його у 2012 та 2013 роках). Дублікат виділення дублює виділення та цілі рядки - їх потрібно лише частково вибрати. Стандартний ярлик - ALT+ D.


5

Я не знаю, чи існує це у Visual Studio 2008, але в Visual Studio 2010+ ви легко можете це зробити:

Не вибирайте нічого, потім натисніть Ctrl+ CА потім (не роблячи нічого іншого) Ctrl+V


5

У Visual studio 2017 та, можливо, в іншій версії Не потрібно макро чи розширення ,

  1. Йти до Tools > Options > Environment > Keyboards
  2. Під Show commands containing:записомEdit.Duplicate
  3. Покладіть курсор на Press shortcut keys:і натисніть Ctrl+ Dта натисніть Assignкнопку
  4. натисніть, OKщоб зберегти нову комбінацію клавіш

введіть тут опис зображення


4

Я використовував макрос, який розмістив Wael: Копія рядка дублювання для Visual Studio , але тиждень тому він перестав працювати, я припустив, що через оновлення Windows. І я був прав, станом на лютий 2014 року макроси були відключені у VS2010 (і, мабуть, 2008 р.).

Щоб виправити це, вам доведеться або видалити оновлення безпеки, або додати один рядок коду в конфігураційні файли, як показано тут .

На 64-бітній машині Windows шляхами до цих файлів за замовчуванням є:

  • C:\Program Files (x86)\Common Files\Microsoft Shared\VSA\9.0\VsaEnv\vsaenv10.exe.config
  • C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.config

    ...
    <configuration>
        <runtime>
            <AllowDComReflection enabled="true"/>
            ...
    

    скріншот редактора

Ви ОБОВ'ЯЗКОВО запускаєте текстовий редактор з правами адміністратора, інакше він не працюватиме! Сподіваємось, це допомагає іншим, у кого раптом макро-функціональність витягнута з-під них.


4

для Visual Studio 2012, 2013, 2015, 2017 перейдіть за посиланням та завантажте розширення

https://marketplace.visualstudio.com/items?itemName=ctlajoie.DuplicateSelection

Тепер перейдіть до Інструменти> Параметри> Клавіатура та введіть "Копіювати" у полі пошуку (повна командна рядок - "Редагувати.ДуплікаціяВибір"). Тут ви можете прив’язати його до будь-якого ярлика так само, як і для будь-якої іншої команди.


3

Просто поставте мишу на рядок, щоб скопіювати і зробити CTRL+ C, потім CTRL+ Vу тому ж рядку. Діє як магія :-)



3

Для тих, хто все ще переглядає це питання у Visual Studio після 2008 року, додано справжній редактор.Дуплікація:

  • CTRL+ E,V
  • CTRL+ D(VS 2017 15.6+)

2

Ctrl+ D- це новий ярлик, представлений у VS 2017 v15.6, який, здається, робить саме те, що Ctrl+ E,V

Ctrl + D буде дублювати рядок, в якому знаходиться курсор, і вставить його прямо під лінією у фокусі. Якщо ви хочете дублювати певний набір коду, просто виберіть частину коду, яку ви хочете дублювати, перш ніж викликати команду дублюючого коду.

Це не вплине на ваш буфер обміну

Джерело


1
Свіжа установка VS2017 та VS2019: Ctrl + D за замовчуванням не відображається на Editor.DuplicateLine ...
thomasgalliker

2

Для Visual Studio Code 2019 :

Редагування комбінацій клавіш меню за допомогою: ctrl+k і ctrl+s

Відредагуйте "Копіювати рядок вниз" ( Shift+ Alt+ DownArrow) на власний ярлик.

Ви можете знайти його за допомогою ідентифікатора команди: editor.action.copyLinesDownAction

Для мене це ctrl+d


1

http://www.jetbrains.com/resharper/

Моя історія: почав працювати в новій компанії, ніколи раніше не використовував Visual Studio. Одне з перших речей - як дублювати рядок. Після налаштування макросу ReSharper сказав мені: чи хотіли б ви замінити мій ярлик, який був: "дублікат тексту" :)


resharper - дуже повільно
Хорев Іван

1

У Visual Studio 2010 ви копіюєте весь рядок, на якому курсор увімкнено CTRL+, INSERTтоді ви можете використовувати Ctrl+ Vабо SHIFT+, INSERTщоб вставити його.



1

Команда, яку ви хочете, - Edit.Duplicate . Він відображається CtrlE, CtrlV. Це не замінить ваш буфер обміну.


1

Я використовую посилання на додаток: AutoHotkey з наведеним нижче кодом, збереженим у CommentDuplikateSaveClipboard.ahkфайлі. Ви можете редагувати / видаляти ярлики, це легко.
У мене є посилання на цей файл "Shortcut to CommentDuplikateSaveClipboard.ahk"в Autostartу вікнах.
Цей скрипт захищає ваш буфер обміну.
Якщо вам цікавіше, ви додасте ярлики до цього сценарію, що виконується / увімкніть.
Я іноді використовую дуже вражаючий Multi Clipboardсценарій для легкої ручки з багатьма clipsзбережені на диску і використання з CTRL+ C, X, Vкопіювати, вставити, вирізати, наступна, попередня, це видалити, видалити все.

;CommentDuplikateSaveClipboard.ahk

!c:: ; Alt+C === Duplicate Line
^d:: ; Ctrl+D
ClipSaved := ClipboardAll
Send, {END}{SHIFTDOWN}{HOME}{SHIFTUP}{CTRLDOWN}c{CTRLUP}{END}{ENTER}{CTRLDOWN}v{CTRLUP}{HOME}
Clipboard := ClipSaved
ClipSaved =
return

!x:: ; Alt+X === Comment Duplicate Line
ClipSaved := ClipboardAll
Send, {END}{SHIFTDOWN}{HOME}{SHIFTUP}{CTRLDOWN}c{CTRLUP}{LEFT}//{END}{ENTER}{CTRLDOWN}v{CTRLUP}{HOME}
Clipboard := ClipSaved
ClipSaved =
return

!z:: ; Alt+Z === Del uncomment  Line
ClipSaved := ClipboardAll
Send, {END}{SHIFTDOWN}{UP}{END}{SHIFTUP}{DEL}{HOME}{DEL}{DEL}
Clipboard := ClipSaved
ClipSaved =
return

!d:: ; Alt+D === Delete line
Send, {END}{SHIFTDOWN}{UP}{END}{SHIFTUP}{DEL}
return

!s:: ; Alt+S === Swap lines
ClipSaved := ClipboardAll
Send, {END}{SHIFTDOWN}{UP}{END}{SHIFTUP}{CTRLDOWN}x{CTRLUP}{UP}{END}{CTRLDOWN}v{CTRLUP}{HOME}
Clipboard := ClipSaved
ClipSaved =
return

!a:: ; Alt+A === Comment this line, uncomment above
Send, {END}{HOME}//{UP}{HOME}{DEL}{DEL}
return

0

Не відповідь, а лише корисне доповнення: як халява, я щойно вигадав (ну ... е-е ... коригував код, розміщений Лоло) макрос RemoveLineOrBlock. Насолоджуйтесь!

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports EnvDTE90a
Imports EnvDTE100
Imports System.Diagnostics

Public Module RemoveLineOrBlock

    Sub RemoveLineOrBlock()
        Dim selection As TextSelection = DTE.ActiveDocument.Selection
        Dim lineNumber As Integer
        Dim line As String

        If selection.IsEmpty Then
            selection.StartOfLine(0)
            selection.EndOfLine(True)
        Else
            Dim top As Integer = selection.TopLine
            Dim bottom As Integer = selection.BottomLine

            selection.MoveToDisplayColumn(top, 0)
            selection.StartOfLine(0)

            selection.MoveToDisplayColumn(bottom, 0, True)
            selection.EndOfLine(True)
        End If

        selection.LineDown(True)
        selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstColumn,True)

        selection.Delete()

        selection.MoveToDisplayColumn(selection.BottomLine, 0)
        selection.StartOfLine(vsStartOfLineOptions.vsStartOfLineOptionsFirstText)

    End Sub

End Module

0

у VS2019, а також у VS2017 ви можете вибрати Інструменти-> Параметри-> Клавіатура, і ви можете вибрати в схемі випадаючий Resharper (Visual Studio) параметр, і ви отримаєте відображення, як якщо б ви використовували Resharper , у цьому випадку Ctrl+ Dзробить трюк для дублювання рядка. У будь-якому випадку, виходячи з документації, це повинно бути поза воротами у Visual Studio 2017 версії 15.8 або новішої


-3

Для візуальної студії 2010 спробуйте скористатися цими командами для швидкого дублювання рядків (використовує буфер обміну):

  • Клацніть на рядок, який потрібно скопіювати. Ctrl+ Cскопіює цей рядок.

  • Потім натисніть Ctrl+ Shift+Enter щоб вставити пробіл під точкою вставки

    (Крім того, використовуйте Ctrl+, Enterщоб вставити порожній рядок над точкою вставки.)

  • Потім просто використовуйте Ctrl+, Vщоб вставити рядок.


1
Дуже хороша покрокова інструкція щодо копіювання та вставки. Але ОП шукає спосіб дублювання рядка ...
ᴍᴀᴛᴛ ʙᴀᴋᴇʀ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.