Я только начинаю изучать ASP.Net MVC и обнаруживаю, что пишу много <% =%> в представлениях. Intellisense предоставляет закрывающий%>, но я считаю, что ввод вводного <% = обременительным (мне их сложно набрать :-)).
Я немного поигрался с Rails и IDE NetBeans, где смог набрать:
r<tab> - which would expand to <% %>
и
re<tab> - which would expand to <%= %>
Можно ли сделать что-то подобное в IDE Visual Studio 2008?





Я считаю, что Фрагменты кода подойдет всем.
Я обнаружил, что просто написать макрос, а затем связать его с клавиатурной командой.
Я использую Инструменты-> Макросы-> Обозреватель макросов, чтобы посмотреть, что там есть, и вы можете создать новый модуль и добавить макрос для внедрения вашего кода. Затем вы привязываете его к клавише с помощью 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
Основываясь на комментарии, я дважды проверил ответ на фрагменты ниже, и, к сожалению, он не работает в представлении HTML. Другой способ сделать это - записать макрос:
<%= %> и верните каретку между пробелами после "=".Этого мог будет достаточно, но было бы лучше, чтобы он был во всех проектах, плюс мы хотели бы более эффективное нажатие клавиш, чем CTRL + SHIFT + P:
Теперь вы можете нажать сочетание клавиш (например, 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, затем щелкните правой кнопкой мыши и выберите «Вставить сниппет» -> «Фрагмент».
Извини, Декер. Я обновил ответ с помощью подхода, основанного на макросах. Все еще довольно просто, и должно быть то, что вы ищете.
Эта функция макроса должна делать это:
Основной код будет делать одно из двух: если ничего не выбрано, он просто вставит конструкцию кода <% =%>, если у вас что-то выбрано в редакторе, он обернет этот код конструкцией 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
Спасибо, Брайан. Это тоже хорошо работает и имеет то преимущество, что работает с выделенным текстом.
Фрагменты кода в представлении HTML не работают. Он запланирован для следующей версии Visual Studio. Я бы сейчас рассмотрел подход с использованием макросов или посмотрел, позволяют ли другие инструменты создавать фрагменты в редакторе HTML.
Один хороший инструмент, который позволит вам это сделать, - Resharper. Вы можете создавать свои собственные шаблоны, которые будут делать то, что вам нужно, но также будут иметь окружение тегами. Есть целый ряд функций, и они того стоят за свою цену.
Спасибо, Крис. Я обнаружил, что не могу установить его как фрагмент XML, если не изменил язык на «XML»? И даже после этого я не получаю никаких фрагментов, которые можно было бы показывать при редактировании страницы .ASPX? Предлагается, если я отредактирую файл XML. Но asp <tab> <tab> не вызывает его; хотя меню может.