Самый быстрый способ вставить символы замены в Visual Studio

Я только начинаю изучать ASP.Net MVC и обнаруживаю, что пишу много ‹%= %> в представлениях. Intellisense предоставляет закрывающий %>, но я считаю, что печатать вступительный ‹%= обременительно (мне сложно их печатать :-)).

Я немного повозился с Rails и IDE NetBeans, где мне удалось ввести:

r<tab>  - which would expand to <%  %>

и

re<tab>  - which would expand to <%= %>

Можно ли сделать что-то подобное в Visual Studio 2008 IDE?


person Howard Pinsley    schedule 04.11.2008    source источник


Ответы (6)


Эта функция макроса должна сделать это:

Основной код выполнит одно из двух действий: если ничего не выбрано, он просто вставит кодовую конструкцию ‹%= %>, если у вас в данный момент что-то выделено в редакторе, он обернет этот код конструкцией E.G. ‹%= выбранный здесь код %>

Public Sub WrapMVC()
    Try
        DTE.UndoContext.Open("Wrap MVC")
        Dim OutText As String = ""
        Dim OutFormat As String = "<%={0} %>"
        DTE.ActiveDocument.Selection.Text = String.Format(OutFormat, ActiveWindowSelection)
    Finally
        DTE.UndoContext.Close()
    End Try
End Sub

Вспомогательные процедуры:

Friend Function ActiveWindowSelection() As String
    If DTE.ActiveWindow.ObjectKind = EnvDTE.Constants.vsWindowKindOutput Then
        Return OutputWindowSelection()
    End If
    If DTE.ActiveWindow.ObjectKind = "{57312C73-6202-49E9-B1E1-40EA1A6DC1F6}" Then
        Return HTMLEditorSelection()
    End If
    Return SelectionText(DTE.ActiveWindow.Selection)
End Function

Private Function HTMLEditorSelection() As String
    Dim hw As EnvDTE.HTMLWindow = ActiveDocument.ActiveWindow.Object
    Dim tw As TextWindow = hw.CurrentTabObject
    Return SelectionText(tw.Selection)
End Function

Private Function OutputWindowSelection() As String
    Dim w As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)
    Dim ow As OutputWindow = w.Object
    Dim owp As OutputWindowPane = ow.OutputWindowPanes.Item(ow.ActivePane.Name)
    Return SelectionText(owp.TextDocument.Selection)
End Function

Private Function SelectionText(ByVal sel As EnvDTE.TextSelection) As String
    If sel Is Nothing Then
        Return ""
    End If
    If sel.Text.Length <= 2 Then
        SelectWord(sel)
    End If
    If sel.Text.Length <= 2 Then
        Return ""
    End If
    Return sel.Text
End Function

Private Sub SelectWord(ByVal sel As EnvDTE.TextSelection)
    Dim leftPos As Integer
    Dim line As Integer
    Dim pt As EnvDTE.EditPoint = sel.ActivePoint.CreateEditPoint()

    sel.WordLeft(True, 1)
    line = sel.TextRanges.Item(1).StartPoint.Line
    leftPos = sel.TextRanges.Item(1).StartPoint.LineCharOffset
    pt.MoveToLineAndOffset(line, leftPos)
    sel.MoveToPoint(pt)
    sel.WordRight(True, 1)
End Sub
person Brian Schmitt    schedule 04.11.2008

Основываясь на комментарии, я дважды проверил приведенный ниже фрагмент ответа, и, к сожалению, он не работает в представлении HTML. Другой способ сделать это — через записанный макрос:

  • В веб-проекте начните запись: CTRL+SHIFT+R
  • Введите <%= %>, затем верните курсор между пробелами после "="
  • Остановить запись: CTRL+SHIFT+R
  • Вставьте макрос через CTRL+SHIFT+P

Этого может быть достаточно, но было бы лучше иметь его во всех проектах, плюс мы хотели бы более удобное сочетание клавиш, чем CTRL+SHIFT +P:

  • Сохраните макрос: Инструменты->Макросы->Сохранить временный макрос, дав ему имя
  • Bind it to a keystroke combination:
    • Tools->Options, and choose the Keyboard node
    • Найдите имя, которое вы выбрали
    • Введите комбинацию клавиш (например, ALT+A) и нажмите OK.

Теперь вы можете нажать сочетание клавиш (например, ALT+A) в представлении HTML, он вставит ‹%= %> и поместит курсор в теги, готовые для Вход.


[Старый ответ: к сожалению, не работает в режиме HTML.]

Для фрагмента кода создайте файл фрагмента XML (например, «asp.snippet») с именем, ярлыком и расширением, затем используйте «Инструменты» -> «Диспетчер фрагментов кода», чтобы добавить папку, в которой хранится фрагмент.

Вот XML для фрагмента, который (через "asp[tab][tab]") расширяет "‹%= [code] %>"

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippet Format="1.0.0"  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <Header>
    <Title>ASP Server Tags</Title>
    <Author>Chris Bowen</Author>
    <Shortcut>asp</Shortcut>
    <Description>ASP.NET server escape characters, including equals</Description>
    <SnippetTypes>
      <SnippetType>SurroundsWith</SnippetType>
      <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
  </Header>
  <Snippet>
    <Declarations>
      <Literal>
        <ID>code</ID>
        <Default>Code</Default>
      </Literal>
    </Declarations>
    <Code Language="csharp">
      <![CDATA[<%= $code$ $selected$%>$end$]]>
    </Code>
  </Snippet>
</CodeSnippet>

Дополнительные сведения см. здесь, в MSDN.

Кстати, в VS есть фрагмент для создания фрагментов. Просто откройте новый файл XML, затем щелкните правой кнопкой мыши и выберите «Вставить фрагмент» -> «Фрагмент».

person Chris Bowen - MSFT    schedule 04.11.2008

Я считаю, что фрагменты кода подойдут. .

person Tom Ritter    schedule 04.11.2008

Я обнаружил, что проще написать макрос, а затем связать его с командой клавиатуры.

Я использую Tools->Macros->Macro Explorer, чтобы увидеть, что там есть, и вы можете создать новый модуль и добавить макрос для внедрения своего кода. Затем вы привязываете его к клавише с помощью Инструменты-> Настроить-> Клавиатура...

Поскольку это не слишком отличается от того, что вы делаете, вот макрос для ввода исходной команды с датой и именем пользователя - VBScript - я не стал искать другие альтернативы.

Imports System
Imports EnvDTE
Imports EnvDTE80
Imports EnvDTE90
Imports System.Diagnostics

Public Module Module1

    Private Function GetUserName() As String
        GetUserName = System.Environment.UserName
    End Function

    Sub InjectChangeComment()
        ActiveDocument().Selection().Text = "// " + System.DateTime.Now.ToString("MM-dd-yy") + " " + GetUserName() + vbTab + vbTab + vbTab
    End Sub

End Module
person plinth    schedule 04.11.2008

Фрагменты кода в представлении HTML не работают. Он намечен для следующей версии Visual Studio. На данный момент я бы посмотрел на подход Macro или посмотрел, позволяют ли другие инструменты использовать фрагменты в редакторе HTML.

person Haacked    schedule 04.11.2008

Одним из хороших инструментов, который позволит вам это сделать, является Resharper. Вы можете создавать свои собственные шаблоны, которые будут делать то, что вам нужно, но также будут окружены тегами. Есть целый ряд функций и стоит того по цене.

person anonym0use    schedule 07.11.2008