Самый быстрый способ вставить заменяющие символы в Visual Studio - PullRequest
2 голосов
/ 04 ноября 2008

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

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

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

и

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

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

Ответы [ 6 ]

4 голосов
/ 04 ноября 2008

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

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

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

  • Сохранить макрос: Инструменты-> Макросы-> Сохранить временный макрос, присвоив ему имя
  • Свяжите это с комбинацией клавиш:
    • Инструменты-> Параметры и выберите узел Клавиатура
    • Поиск по названию, которое вы выбрали
    • Введите комбинацию клавиш (например, 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, затем щелкните правой кнопкой мыши и выберите «Вставить фрагмент ->« Фрагмент ».

»
2 голосов
/ 04 ноября 2008

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

Основной код будет выполнять одно из двух действий: если ничего не выбрано, он просто вставит конструкцию кода <% =%>, если у вас есть что-то выбранное в редакторе, он обернет этот код конструкцией 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
0 голосов
/ 07 ноября 2008

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

0 голосов
/ 05 ноября 2008

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

0 голосов
/ 04 ноября 2008

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

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

Поскольку это не слишком отличается от того, что вы делаете, вот макрос для ввода исходной команды с датой и именем пользователя - 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
0 голосов
/ 04 ноября 2008

Я полагаю, Фрагменты кода подойдут.

...