VSCode'u PowerShell ile Genişletme
Geçen yıl birincil PowerShell geliştirme aracım olarak VS Code'a geçmek konusunda bilinçli bir karar verdim. Yıllarımı PowerShell ISE'yi ayarlamak ve özelleştirmek için harcadım, bu yüzden geçiş konusunda biraz endişeliydim. Ancak VS Code'da uzmanlaşmamın tek yolunun (ve hala gidecek çok yolum var) onu her zaman kullanmak olacağını biliyordum. VSCode'un bunu mümkün kılan özelliklerinden biri de PowerShellEditorServices'tir. İşlevselliğin çoğu, PowerShell ISE'deki $PSISE'ye benzer şekilde VS Code'daki $PSEditor nesnesi aracılığıyla sunulur. Ne yazık ki konuyla ilgili çok fazla BT Profesyoneli dostu materyal yok. O halde biraz ekleme yapayım.
VS Code profilimde ($profile), düzenleyiciyi yapılandırmak için komutlar ekliyorum. Yaptığım şeylerden biri özel komutlar eklemek için Register-EditorCommand cmdlet'ini kullanmak. Bunları komut paletine erişerek ve PowerShell: PowerShell Modüllerinden Ek Komutları Göster'i seçerek alabilirim.
Bunu seçtiğimde mevcut komutların bir listesini alıyorum:
Bunlar VSCode profilimde tanımlayıp eklediğim komutlardır. İşte nasıl yapılacağı.
Blog yazıları hazırlamak için Open Live Writer kullanıyorum. Blogum kod örneklerini biçimlendirmek için Crayon eklentisini kullanıyor. İşleri hızlandırmak için gerekli HTML kodunu yerel kaynağıma ekleyebilirim. PowerShell ISE'de, seçilen metni kopyalayacak, gerekli HTML'yi ekleyecek ve sonucu, Open Live Writer'a yapıştırabileceğim panoya kopyalayacak özel bir menü eklentim vardı. Aynı şeyi VS Code için de yapmam gerekiyordu.
Function ExportAsCrayon {
[cmdletbinding()]
param ([Microsoft.PowerShell.EditorServices.Extensions.EditorContext]$context)
$text = $context.CurrentFile.GetText($context.SelectedRange).Replace(">", ">").Replace("<", "<").Trim()
$code = @"
<pre class="lang:ps mark:0 decode:true">
$text
</pre>
"@
$code | Set-clipboard
$psEditor.Window.ShowInformationMessage("The selected text has been converted and copied to the clipboard.")
}
VSCode için yazdığınız çoğu işlev büyük olasılıkla $Context parametresini kullanacaktır. Adından da anlaşılacağı gibi bu, VSCode'a nerede olduğunuzu söyler ve bazı yöntem ve özelliklere erişmenizi sağlar. Fonksiyonumda seçilen metni almak için CurrentFile nesnesini ve GetText() yöntemini kullanıyorum. İşin zor yanı, aktarmanız gereken parametrenin $Context'teki SelectedRange özelliği olmasıdır. Bu çok iyi belgelenmemiş şeylerden biri. Kodumun geri kalanı, HTML'mdeki açılı ayraç karakterlerinden kaçmak için Change() yöntemini kullanıyor. Bu, panoya gönderilen $code adlı buradaki dizeye takılır.
Son adım, görsel bir istem sağlayacak ShowInformationMessage() öğesini çağırmaktır.
Bunun gibi yöntemleri de kullanabilirsiniz:
$pseditor.window.ShowErrorMessage("You made a mistake")
$pseditor.window.ShowWarningMessage("I wouldn't do that if I were you.")
Fonksiyona sahip olduğumda onu VS Code'a kaydedebilirim.
Register-EditorCommand -Name ExportAsCrayon -DisplayName "Export Code as Crayon" -Function ExportAsCrayon
Bu bir PowerShell cmdlet'idir, dolayısıyla bu konudaki yardımı okuyabilirsiniz. Ad, program adıdır ve DisplayName, açılır listede gördüğünüz addır.
Ancak bu komuta erişmek için birkaç klavye adımı gerekir. VS Code klavye kısayolları ve bağlamalarla doludur. Kendiminkini yaratmak isterim.
Ne yazık ki, şu anda programlı olarak bir klavye kısayolu oluşturmanın veya tanımlamanın bir yolu yoktur. Bunun yerine Dosya - Tercihler - Klavye Kısayolları'na gitmeniz ve ardından keybindings.json'u düzenlemek için bağlantıyı tıklamanız gerekir.
Varsayılan uygulama ayarları sol panelde, özel ayarlarınız ise sağda olacaktır. Yeni bir tane eklemek için sonuncudan sonra ancak kapanış köşeli parantezinden önce virgül ekleyin. Daha sonra bir {} kümesi girin.
Bir anahtar girmeniz gerekecek. Ctrl+F6 kullanacağım. “Komut” ayarı “PowerShell.InvokeRegisteredEditorCommand” olacaktır. İşin zor kısmı ve çözmem en uzun süren şey parametre veya argüman değeridir. Yöntemin ne yapacağı oldukça açık. Şuna benzeyen bir değere sahip bir "args" anahtarı oluşturun: "commandName": "ExportAsCrayon"}. Kayıtlı komutunuzun kısa adını kullanın. İsteğe bağlı olarak, tuş bağlamanın "ne zaman" etkin olacağına ilişkin bir ayar ekleyebilirsiniz. Editör aktif olduğunda benimkinin olmasını istiyorum. İşte tam json girişi.
{
"key":"ctrl+f6",
"command": "PowerShell.InvokeRegisteredEditorCommand",
"args" : {"commandName": "ExportAsCrayon"},
"when": "editorTextFocus"
}
Dosyayı kaydedin ve kullanmaya hazırsınız. Beklediğiniz sonuçları veya hataları alamazsanız girişinizi kontrol edin. Json büyük/küçük harfe duyarlıdır. Args girişi “commandName” olmalıdır. Genellikle diğer önemli bağlama girişlerine dayanarak durumu takip etmeye çalışıyorum.
Ama artık tamamen hazırım. Register-EditorCommand ifadesi VSCode profilimde bulunuyor ve tuş bağlamayı yalnızca bir kez eklemem gerekiyor. Artık metni seçebilir, Ctrl+F6 tuşlarına basabilir ve Crayon formatlı kodumun panoya kopyalanmasını sağlayabilirim.
Umarım bu size yardımcı olur ve biraz kafa çarpmanızı önler. Sanırım bunu hepimiz için yeterince yaptım.