{"id":32204,"date":"2025-10-19T00:01:23","date_gmt":"2025-10-18T21:01:23","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/"},"modified":"2025-10-19T00:01:23","modified_gmt":"2025-10-18T21:01:23","slug":"dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/","title":{"rendered":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)"},"content":{"rendered":"<p>Geli\u015ftiricilerin g\u00fcnl\u00fck kod yazma deneyimini k\u00f6kten de\u011fi\u015ftiren Dil Sunucusu Protokol\u00fc (LSP), modern IDE&#8217;lerin ve kod edit\u00f6rlerinin vazge\u00e7ilmez bir par\u00e7as\u0131 haline geldi. \u00d6zellikle kod tamamlama, yani &#8220;completion&#8221; \u00f6zelli\u011fi, geli\u015ftirme s\u00fcrecini h\u0131zland\u0131r\u0131rken hatalar\u0131 azaltma konusunda kilit rol oynar. Peki, kendi dil sunucunuzu olu\u015ftururken bu temel \u00f6zelli\u011fi nas\u0131l entegre edersiniz ve geli\u015ftiricilere nas\u0131l p\u00fcr\u00fczs\u00fcz bir deneyim sunars\u0131n\u0131z? Bu makalede, Language Server Protocol&#8217;\u00fcn temel tamamlama mekanizmalar\u0131n\u0131 derinlemesine inceleyecek, ad\u0131m ad\u0131m uygulamal\u0131 \u00f6rneklerle kendi dil sunucunuzda bu \u00f6zelli\u011fi nas\u0131l hayata ge\u00e7irebilece\u011finizi \u00f6\u011freneceksiniz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, kod edit\u00f6rleri ve entegre geli\u015ftirme ortamlar\u0131 (IDE&#8217;ler), sunduklar\u0131 ak\u0131ll\u0131 \u00f6zelliklerle geli\u015ftiricilerin verimlili\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rmaktad\u0131r. Eskiden her IDE&#8217;nin veya edit\u00f6r\u00fcn her programlama dili i\u00e7in kendi \u00f6zel eklentisini yazmas\u0131 gerekirken, bu durum hem kaynak israf\u0131na yol a\u00e7\u0131yor hem de tutars\u0131z bir geli\u015ftirme deneyimi sunuyordu. \u0130\u015fte tam da bu noktada, Microsoft taraf\u0131ndan geli\u015ftirilen Language Server Protocol (LSP), sekt\u00f6re standart bir \u00e7\u00f6z\u00fcm getirerek adeta bir devrim yaratt\u0131. LSP, dil odakl\u0131 \u00f6zelliklerin (kod tamamlama, tan\u0131ma gitme, referans bulma, yeniden adland\u0131rma vb.) dil sunucular\u0131 ad\u0131 verilen ayr\u0131 bir i\u015flemde y\u00fcr\u00fct\u00fclmesini ve edit\u00f6rlerle (istemciler) standart bir JSON-RPC tabanl\u0131 protokol \u00fczerinden ileti\u015fim kurmas\u0131n\u0131 sa\u011flar. Bu sayede, tek bir dil sunucusu birden fazla edit\u00f6r (VS Code, Sublime Text, Vim, Emacs vb.) taraf\u0131ndan kullan\u0131labilir hale gelirken, geli\u015ftiriciler de sevdikleri edit\u00f6rde ayn\u0131 zengin dil \u00f6zelliklerine eri\u015febilirler.<\/p>\n<p>LSP&#8217;nin sundu\u011fu \u00f6zellikler aras\u0131nda belki de en \u00e7ok kullan\u0131lan\u0131 ve geli\u015ftirici deneyimi a\u00e7\u0131s\u0131ndan en kritik olan\u0131 &#8220;kod tamamlama&#8221; (completion) \u00f6zelli\u011fidir. Klavyede birka\u00e7 harf yazd\u0131\u011f\u0131n\u0131zda, edit\u00f6r\u00fcn\u00fcz\u00fcn size ilgili anahtar kelimeleri, de\u011fi\u015fkenleri, fonksiyonlar\u0131 veya nesne \u00fcyelerini otomatik olarak \u00f6nermesi, hem yaz\u0131m hatalar\u0131n\u0131 azalt\u0131r hem de API&#8217;leri veya s\u00f6zdizimini s\u00fcrekli dok\u00fcmantasyonda arama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r. Bu, \u00f6zellikle yeni bir k\u00fct\u00fcphane \u00f6\u011frenirken veya karma\u015f\u0131k bir kod taban\u0131nda gezinirken paha bi\u00e7ilmez bir kolayl\u0131k sunar. Temel tamamlama, yani ba\u011flama dayal\u0131 olarak statik anahtar kelime veya tan\u0131mlay\u0131c\u0131 \u00f6nerileri sunma, bir dil sunucusunun olmazsa olmaz\u0131d\u0131r. \u00d6rne\u011fin, &#8220;con&#8221; yazd\u0131\u011f\u0131n\u0131zda <code>console.log<\/code> veya <code>const<\/code> gibi se\u00e7eneklerin sunulmas\u0131, geli\u015ftiricinin d\u00fc\u015f\u00fcnme h\u0131z\u0131nda kod yazmas\u0131na olanak tan\u0131r. Bir dil sunucusu geli\u015ftirirken bu \u00f6zelli\u011fi do\u011fru ve verimli bir \u015fekilde uygulamak, kullan\u0131c\u0131lar\u0131n dilinizi benimsemesi ve \u00fcretken olabilmesi i\u00e7in temel bir ad\u0131md\u0131r. Bu \u00e7er\u00e7evede, LSP&#8217;nin sa\u011flad\u0131\u011f\u0131 standart <code>textDocument\/completion<\/code> iste\u011fi, istemci ve sunucu aras\u0131ndaki bu etkile\u015fimi tan\u0131mlar. Sunucu, kullan\u0131c\u0131n\u0131n mevcut imle\u00e7 konumuna ve yazd\u0131\u011f\u0131 metne g\u00f6re ilgili tamamlama \u00f6\u011felerini hesaplar ve istemciye geri g\u00f6nderir. \u0130stemci de bu \u00f6\u011feleri kullan\u0131c\u0131 aray\u00fcz\u00fcnde \u015f\u0131k bir \u015fekilde sunar. Bu mekanizma sayesinde, dil sunucular\u0131 geli\u015ftirici \u00fcretkenli\u011fini do\u011frudan etkileyen g\u00fc\u00e7l\u00fc ara\u00e7lara d\u00f6n\u00fc\u015f\u00fcr.<\/p>\n<h2>Temel Tamamlama Mekanizmas\u0131n\u0131 Anlamak: Bir Bak\u0131\u015fta \u0130\u015f Ak\u0131\u015f\u0131<\/h2>\n<p>Bir dil sunucusunda temel tamamlama \u00f6zelli\u011finin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak, bu \u00f6zelli\u011fi kendi projenize entegre etmeden \u00f6nceki en \u00f6nemli ad\u0131md\u0131r. Bu s\u00fcre\u00e7, temelde istemci (kod edit\u00f6r\u00fc) ile sunucu (dil sunucusu) aras\u0131ndaki s\u00fcrekli bir diyalog \u00fczerine kuruludur ve Language Server Protocol bu diyalo\u011fun dilini standartla\u015ft\u0131r\u0131r. Geli\u015ftirici kod yazarken, belirli bir tu\u015fa bast\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir nokta <code>.<\/code> veya bir bo\u015fluk) ya da edit\u00f6r\u00fcn belirledi\u011fi bir gecikme s\u00fcresi sonunda, istemci dil sunucusuna bir &#8220;tamamlama iste\u011fi&#8221; g\u00f6nderir. Bu istek, LSP&#8217;de <code>textDocument\/completion<\/code> olarak adland\u0131r\u0131l\u0131r.<\/p>\n<p>Bu iste\u011fi daha yak\u0131ndan inceleyecek olursak, istemcinin sunucuya g\u00f6nderdi\u011fi mesajlar <code>CompletionParams<\/code> ad\u0131 verilen bir nesne i\u00e7erir. Bu nesne, sunucunun tamamlama \u00f6nerilerini do\u011fru bir \u015fekilde hesaplamas\u0131 i\u00e7in gerekli olan kritik bilgileri ta\u015f\u0131r. <code>CompletionParams<\/code> genellikle \u015fu anahtar alanlar\u0131 bar\u0131nd\u0131r\u0131r:<\/p>\n<ul>\n<li><code>textDocument<\/code>: Tamamlama iste\u011finin yap\u0131ld\u0131\u011f\u0131 a\u00e7\u0131k dosyan\u0131n URI&#8217;sini (benzersiz kaynak tan\u0131mlay\u0131c\u0131s\u0131) i\u00e7erir. Bu, sunucunun do\u011fru dosyay\u0131 bulup i\u00e7eri\u011fini i\u015flemesini sa\u011flar.<\/li>\n<li><code>position<\/code>: \u0130mlecin belgedeki tam konumunu (sat\u0131r ve s\u00fctun numaralar\u0131) belirtir. Bu bilgi, sunucunun imle\u00e7ten \u00f6nceki metni analiz ederek hangi \u00f6nerilerin relevant oldu\u011funu belirlemesi i\u00e7in hayati \u00f6neme sahiptir.<\/li>\n<li><code>context<\/code> (iste\u011fe ba\u011fl\u0131): Tamamlama iste\u011finin ne t\u00fcr bir ba\u011flamda yap\u0131ld\u0131\u011f\u0131n\u0131 belirten ek bilgiler i\u00e7erebilir. \u00d6rne\u011fin, bir tetikleyici karakter (<code>triggerCharacter<\/code>, e.g., <code>.<\/code>, <code>:<\/code>), bir tetikleyici neden (<code>triggerKind<\/code>, e.g., <code>Invoked<\/code>, <code>TriggerCharacter<\/code>, <code>ContentChange<\/code>) gibi detaylar, sunucunun daha ak\u0131ll\u0131 \u00f6neriler sunmas\u0131na yard\u0131mc\u0131 olabilir.<\/li>\n<\/ul>\n<p>Sunucu bu iste\u011fi ald\u0131\u011f\u0131nda, \u00f6ncelikle ilgili dosyan\u0131n i\u00e7eri\u011fini al\u0131r ve imle\u00e7 konumunu kullanarak o noktadaki metin ve ba\u011flam analizini yapar. \u00d6rne\u011fin, kullan\u0131c\u0131n\u0131n &#8220;co&#8221; yazd\u0131\u011f\u0131n\u0131 varsayal\u0131m. Sunucu, imle\u00e7ten \u00f6nceki metni kontrol eder ve bu k\u0131sma uyan anahtar kelimeleri, \u00f6nceden tan\u0131mlanm\u0131\u015f de\u011fi\u015fkenleri veya fonksiyon adlar\u0131n\u0131 arar. Buldu\u011fu potansiyel tamamlama \u00f6nerilerini <code>CompletionList<\/code> ad\u0131 verilen bir nesne i\u00e7inde istemciye geri g\u00f6nderir.<\/p>\n<p><code>CompletionList<\/code> nesnesi genellikle iki temel alan\u0131 i\u00e7erir:<\/p>\n<ul>\n<li><code>items<\/code>: Bu, <code>CompletionItem<\/code> tipindeki \u00f6nerilerin bir dizisidir. Her bir <code>CompletionItem<\/code>, kullan\u0131c\u0131ya g\u00f6sterilecek tek bir tamamlama se\u00e7ene\u011fini temsil eder.<\/li>\n<li><code>isIncomplete<\/code> (iste\u011fe ba\u011fl\u0131): Sunucunun t\u00fcm olas\u0131 sonu\u00e7lar\u0131 d\u00f6nd\u00fcr\u00fcp d\u00f6nd\u00fcrmedi\u011fini belirten bir boolean de\u011feridir. E\u011fer <code>true<\/code> ise, istemci daha fazla sonu\u00e7 i\u00e7in tekrar istek g\u00f6ndermeye devam edebilir.<\/li>\n<\/ul>\n<p>Her bir <code>CompletionItem<\/code>, kullan\u0131c\u0131n\u0131n g\u00f6rd\u00fc\u011f\u00fc etiketi (<code>label<\/code>), \u00f6nerinin tipini (<code>kind<\/code> &#8211; anahtar kelime, de\u011fi\u015fken, fonksiyon vb.), daha fazla bilgi i\u00e7in detay (<code>detail<\/code>) ve dok\u00fcmantasyon (<code>documentation<\/code>), s\u0131ralama i\u00e7in <code>sortText<\/code> ve filtreleme i\u00e7in <code>filterText<\/code> gibi bir\u00e7ok alan\u0131 i\u00e7erebilir. Bu zengin yap\u0131s\u0131 sayesinde, dil sunucular\u0131 sadece basit metin \u00f6nerileri sunmakla kalmaz, ayn\u0131 zamanda \u00f6nerilen \u00f6\u011fe hakk\u0131nda ba\u011flamsal bilgi ve a\u00e7\u0131klamalar da sa\u011flayarak geli\u015ftiricinin karar verme s\u00fcrecini destekler. \u00d6rnek olarak, JavaScript&#8217;te <code>console.<\/code> yaz\u0131ld\u0131\u011f\u0131nda, LSP sunucusu <code>log<\/code>, <code>warn<\/code>, <code>error<\/code> gibi metotlar\u0131, her birinin k\u0131sa bir a\u00e7\u0131klamas\u0131 ve kullan\u0131m \u015fekliyle birlikte \u00f6nerebilir. Bu entegre i\u015f ak\u0131\u015f\u0131, geli\u015ftiricilerin daha h\u0131zl\u0131, daha do\u011fru ve daha verimli bir \u015fekilde kod yazmas\u0131na olanak tan\u0131r.<\/p>\n<h2>Dil Sunucunuzda Temel Tamamlama \u00d6zelli\u011fini Ad\u0131m Ad\u0131m Geli\u015ftirmek<\/h2>\n<p>Kendi dil sunucunuzu olu\u015ftururken, Language Server Protocol (LSP) standartlar\u0131na uygun bir temel tamamlama \u00f6zelli\u011fi entegre etmek, kullan\u0131c\u0131 deneyimini zenginle\u015ftirmenin kritik bir ad\u0131m\u0131d\u0131r. Bu b\u00f6l\u00fcmde, bir LSP sunucusunda temel tamamlama \u00f6zelli\u011fini ad\u0131m ad\u0131m nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ve bu s\u00fcrecin arkas\u0131ndaki mant\u0131\u011f\u0131 a\u00e7\u0131klayaca\u011f\u0131z. Genellikle Node.js ve TypeScript tabanl\u0131 <code>vscode-languageserver<\/code> k\u00fct\u00fcphanesi, LSP sunucular\u0131 geli\u015ftirmek i\u00e7in yayg\u0131n olarak kullan\u0131l\u0131r. Ancak temel prensipler, kulland\u0131\u011f\u0131n\u0131z programlama dilinden veya k\u00fct\u00fcphaneden ba\u011f\u0131ms\u0131z olarak uygulanabilir.<\/p>\n<h3>LSP Sunucusu Kurulumu ve <code>textDocument\/completion<\/code> \u0130\u015fleyicisi<\/h3>\n<p>\u00d6ncelikle, bir LSP sunucusunun temel yap\u0131s\u0131n\u0131 kurmam\u0131z ve <code>textDocument\/completion<\/code> iste\u011fini i\u015flemek i\u00e7in gerekli altyap\u0131y\u0131 olu\u015fturmam\u0131z gerekiyor. Bir LSP sunucusu, istemciden gelen mesajlar\u0131 dinler ve ilgili i\u015fleyicileri \u00e7a\u011f\u0131r\u0131r. Tamamlama \u00f6zelli\u011fi i\u00e7in, sunucunun <code>onCompletion<\/code> olay\u0131n\u0131 dinlemesi ve gelen isteklere yan\u0131t vermesi gerekir.<\/p>\n<p>Ba\u015flang\u0131\u00e7 olarak, sunucunuzun LSP istemcisine &#8220;tamamlama deste\u011fi&#8221; sundu\u011funu bildirmesi gerekir. Bu, genellikle sunucu ba\u015flat\u0131l\u0131rken g\u00f6nderilen <code>initialize<\/code> yan\u0131t\u0131nda belirtilir. <code>capabilities<\/code> (yetenekler) nesnesinin alt\u0131nda, <code>completionProvider<\/code> alan\u0131 <code>true<\/code> olarak ayarlan\u0131r ve iste\u011fe ba\u011fl\u0131 olarak hangi karakterlerin tamamlama tetikleyicisi oldu\u011funu (<code>triggerCharacters<\/code>) belirtebilirsiniz. \u00d6rne\u011fin, <code>.<\/code> karakteri, nesne \u00fcyelerini tamamlama i\u00e7in s\u0131k\u00e7a kullan\u0131lan bir tetikleyicidir.<\/p>\n<pre><code class=\"language-typescript\">\nconnection.onInitialize((params: InitializeParams) => {\n    \/\/ ... di\u011fer ba\u015flang\u0131\u00e7 ayarlar\u0131 ...\n    return {\n        capabilities: {\n            textDocumentSync: TextDocumentSyncKind.Incremental,\n            completionProvider: {\n                resolveProvider: true, \/\/ Tamamlama \u00f6\u011felerini sonradan \u00e7\u00f6z\u00fcmlemeye izin verir\n                triggerCharacters: ['.', ':', '\"', '\/'] \/\/ Bu karakterler completion'\u0131 tetikleyebilir\n            },\n            \/\/ ... di\u011fer yetenekler ...\n        }\n    };\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rman\u0131n ard\u0131ndan, <code>connection.onCompletion<\/code> metodunu kullanarak gelen tamamlama isteklerini i\u015fleyecek bir fonksiyon tan\u0131mlayabiliriz. Bu fonksiyon, <code>CompletionParams<\/code> t\u00fcr\u00fcnde bir parametre al\u0131r ve <code>CompletionList<\/code> t\u00fcr\u00fcnde bir nesne d\u00f6nd\u00fcrmesi beklenir.<\/p>\n<pre><code class=\"language-typescript\">\nimport {\n    createConnection,\n    TextDocuments,\n    ProposedFeatures,\n    CompletionItem,\n    CompletionItemKind,\n    TextDocumentPositionParams,\n    CompletionList,\n    InitializeParams\n} from 'vscode-languageserver\/node';\n\nimport { TextDocument } from 'vscode-languageserver-textdocument';\n\n\/\/ Bir ba\u011flant\u0131 olu\u015fturun. Bu ba\u011flant\u0131, Node.js IPC \u00fczerinden istemci ile ileti\u015fim kurar.\nconst connection = createConnection(ProposedFeatures.all);\n\n\/\/ Yaln\u0131zca a\u00e7\u0131k metin belgelerinin i\u00e7eri\u011fini y\u00f6neten bir belge y\u00f6neticisi olu\u015fturun\nconst documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument);\n\nconnection.onInitialize((params: InitializeParams) => {\n    console.log('LSP Sunucusu Ba\u015flat\u0131l\u0131yor...', params.capabilities);\n    return {\n        capabilities: {\n            textDocumentSync: TextDocumentSyncKind.Incremental,\n            completionProvider: {\n                resolveProvider: true,\n                triggerCharacters: ['.', ':', '\"', '\/', ' '] \/\/ Ek tetikleyici karakterler\n            }\n        }\n    };\n});\n\n\/\/ Temel tamamlama iste\u011fini i\u015fleyen k\u0131s\u0131m\nconnection.onCompletion(\n    (params: TextDocumentPositionParams): CompletionList => {\n        const document = documents.get(params.textDocument.uri);\n        if (!document) {\n            return { items: [] }; \/\/ Belge bulunamazsa bo\u015f liste d\u00f6nd\u00fcr\n        }\n\n        const text = document.getText();\n        const offset = document.offsetAt(params.position);\n        const line = text.substring(0, offset).split('\\n').pop(); \/\/ \u0130mlecin bulundu\u011fu sat\u0131r\u0131 al\n\n        let completions: CompletionItem[] = [];\n\n        \/\/ \u00d6rnek: Basit anahtar kelime tamamlama\n        \/\/ Diyelim ki \u00f6zel dilimizde 'mycomponent' ve 'myfunction' anahtar kelimeleri var.\n        if (line?.endsWith('my')) {\n            completions.push({\n                label: 'mycomponent',\n                kind: CompletionItemKind.Class, \/\/ S\u0131n\u0131f olarak g\u00f6ster\n                data: 1, \/\/ Benzersiz bir ID, resolve i\u00e7in kullan\u0131labilir\n                detail: '\u00d6zel bile\u015fen tan\u0131m\u0131',\n                documentation: 'Bu, kullan\u0131c\u0131 tan\u0131ml\u0131 bir UI bile\u015fenidir.'\n            });\n            completions.push({\n                label: 'myfunction',\n                kind: CompletionItemKind.Function, \/\/ Fonksiyon olarak g\u00f6ster\n                data: 2,\n                detail: '\u00d6zel bir yard\u0131mc\u0131 fonksiyon',\n                documentation: 'Bu fonksiyon, belirli bir g\u00f6revi yerine getirmek i\u00e7in kullan\u0131l\u0131r.'\n            });\n        }\n        \n        \/\/ \u00d6rnek: Nokta '.' sonras\u0131 tamamlama\n        \/\/ Diyelim ki 'myobject.' yaz\u0131ld\u0131\u011f\u0131nda 'property1' ve 'methodA' \u00f6nerisi veriyoruz.\n        if (line?.endsWith('myobject.')) {\n            completions.push({\n                label: 'property1',\n                kind: CompletionItemKind.Property,\n                data: 3,\n                detail: 'myobject\\'in ilk \u00f6zelli\u011fi',\n                documentation: 'Bu \u00f6zellik, myobject nesnesinin temel bir de\u011ferini tutar.'\n            });\n            completions.push({\n                label: 'methodA()',\n                kind: CompletionItemKind.Method,\n                data: 4,\n                detail: 'myobject\\'in bir metodu',\n                documentation: 'Bu metot, myobject \u00fczerinde belirli bir i\u015flemi ger\u00e7ekle\u015ftirir.'\n            });\n        }\n        \n        \/\/ Bo\u015fluk sonras\u0131 \u00f6zel \u00f6neri\n        \/\/ \u00d6rne\u011fin, sadece \" \" (bo\u015fluk) b\u0131rak\u0131ld\u0131\u011f\u0131nda \"new\" anahtar kelimesini \u00f6nerebiliriz.\n        if (line?.endsWith(' ')) {\n            completions.push({\n                label: 'new',\n                kind: CompletionItemKind.Keyword,\n                data: 5,\n                detail: 'Yeni bir \u00f6\u011fe olu\u015fturur.',\n                documentation: 'Bu anahtar kelime, genellikle yeni bir nesne \u00f6rne\u011fi olu\u015fturmak i\u00e7in kullan\u0131l\u0131r.'\n            });\n        }\n\n        return {\n            items: completions,\n            isIncomplete: false \/\/ T\u00fcm sonu\u00e7lar\u0131 d\u00f6nd\u00fcrd\u00fc\u011f\u00fcm\u00fcz\u00fc belirtiriz\n        };\n    }\n);\n\n\/\/ Tamamlama \u00f6\u011fesi se\u00e7ildikten sonra ek bilgi getirmek i\u00e7in\nconnection.onCompletionResolve(\n    (item: CompletionItem): CompletionItem => {\n        if (item.data === 1) {\n            item.detail = 'Daha fazla detay: \u00d6zel bile\u015fen tan\u0131m\u0131';\n            item.documentation = 'Bu bile\u015fen, kullan\u0131c\u0131 aray\u00fcz\u00fcnde g\u00f6r\u00fcn\u00fcr ve interaktif \u00f6\u011feler bar\u0131nd\u0131r\u0131r.';\n        } else if (item.data === 2) {\n            item.detail = 'Daha fazla detay: \u00d6zel bir yard\u0131mc\u0131 fonksiyon';\n            item.documentation = 'Bu fonksiyon, s\u0131k kullan\u0131lan i\u015flemleri kaps\u00fcller ve kod tekrar\u0131n\u0131 \u00f6nler.';\n        }\n        \/\/ Di\u011fer \u00f6\u011feler i\u00e7in de benzer \u015fekilde detaylar eklenebilir.\n        return item;\n    }\n);\n\n\/\/ Belgeleri dinlemeye ba\u015flay\u0131n. T\u00fcm belge de\u011fi\u015fiklikleri otomatik olarak 'documents' nesnesine kaydedilir.\ndocuments.listen(connection);\n\n\/\/ Ba\u011flant\u0131y\u0131 dinlemeye ba\u015flay\u0131n.\nconnection.listen();\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funda, <code>onCompletion<\/code> i\u015fleyicisi, kullan\u0131c\u0131n\u0131n imle\u00e7 konumundan \u00f6nceki sat\u0131r\u0131 (<code>line<\/code>) al\u0131r ve bu metin par\u00e7as\u0131na g\u00f6re basit tamamlama mant\u0131\u011f\u0131 uygular. \u00d6rne\u011fin, \"my\" ile biten bir metin varsa <code>mycomponent<\/code> ve <code>myfunction<\/code> gibi \u00f6neriler sunulur. Bu, olduk\u00e7a temel bir yakla\u015f\u0131md\u0131r ve ger\u00e7ek bir dil sunucusunda, dilin s\u00f6zdizim a\u011fac\u0131 (AST) veya sembol tablosu (symbol table) gibi daha karma\u015f\u0131k veri yap\u0131lar\u0131 kullan\u0131larak ba\u011flama duyarl\u0131 tamamlama \u00f6nerileri \u00fcretilir. <code>CompletionItemKind<\/code> enum'unu kullanarak \u00f6nerilerin t\u00fcr\u00fcn\u00fc (anahtar kelime, fonksiyon, s\u0131n\u0131f vb.) belirtmek, edit\u00f6r\u00fcn bu \u00f6nerileri g\u00f6rsel olarak daha anla\u015f\u0131l\u0131r hale getirmesine yard\u0131mc\u0131 olur. \u00d6rne\u011fin, fonksiyonlar i\u00e7in bir <code>f<\/code> simgesi, de\u011fi\u015fkenler i\u00e7in bir <code>v<\/code> simgesi g\u00f6sterebilir. <code>detail<\/code> ve <code>documentation<\/code> alanlar\u0131 ise kullan\u0131c\u0131n\u0131n se\u00e7ti\u011fi tamamlama \u00f6\u011fesi hakk\u0131nda an\u0131nda daha fazla bilgi edinmesini sa\u011flar. \u00d6zellikle <code>onCompletionResolve<\/code> i\u015fleyicisi, tamamlama listesi ilk y\u00fcklendi\u011finde hafif kalmas\u0131n\u0131 sa\u011flayarak performans\u0131 art\u0131r\u0131r. Detayl\u0131 dok\u00fcmantasyon gibi daha a\u011f\u0131r bilgiler, kullan\u0131c\u0131 bir \u00f6\u011fenin \u00fczerine geldi\u011finde veya onu se\u00e7ti\u011finde asenkron olarak y\u00fcklenir. Bu strateji, b\u00fcy\u00fck kod tabanlar\u0131 veya \u00e7ok say\u0131da tamamlama \u00f6\u011fesi i\u00e7eren diller i\u00e7in hayati \u00f6neme sahiptir.<\/p>\n<h3>Tamamlama \u00d6\u011felerini Zenginle\u015ftirme: <code>detail<\/code>, <code>documentation<\/code> ve <code>kind<\/code><\/h3>\n<p>Basit <code>label<\/code> alan\u0131n\u0131n \u00f6tesinde, <code>CompletionItem<\/code> nesnesi, tamamlama \u00f6nerilerini \u00e7ok daha bilgilendirici ve kullan\u0131c\u0131 dostu hale getiren bir dizi zenginle\u015ftirme alan\u0131 sunar:<\/p>\n<ul>\n<li><code>kind<\/code>: \u00d6nerilen \u00f6\u011fenin tipini (<code>CompletionItemKind<\/code> enum'undan: <code>Text<\/code>, <code>Method<\/code>, <code>Function<\/code>, <code>Constructor<\/code>, <code>Field<\/code>, <code>Variable<\/code>, <code>Class<\/code>, <code>Interface<\/code>, <code>Module<\/code>, <code>Property<\/code>, <code>Unit<\/code>, <code>Value<\/code>, <code>Enum<\/code>, <code>Keyword<\/code>, <code>Snippet<\/code> vb.) belirtir. Bu, edit\u00f6r\u00fcn aray\u00fcz\u00fcnde ilgili simgeleri g\u00f6stermesini sa\u011flar.<\/li>\n<li><code>detail<\/code>: \u00d6nerilen \u00f6\u011fe hakk\u0131nda k\u0131sa bir a\u00e7\u0131klama veya tip bilgisi sa\u011flar. \u00d6rne\u011fin, bir fonksiyon i\u00e7in parametre tipleri veya d\u00f6n\u00fc\u015f tipi burada g\u00f6sterilebilir.<\/li>\n<li><code>documentation<\/code>: \u00d6\u011fe hakk\u0131nda daha uzun ve detayl\u0131 bir a\u00e7\u0131klama sunar. Bu genellikle Markdown format\u0131nda olabilir ve edit\u00f6r taraf\u0131ndan zengin metin olarak i\u015flenir. Bu alan, API referanslar\u0131n\u0131 do\u011frudan edit\u00f6re getirerek geli\u015ftiricinin ba\u011flam de\u011fi\u015ftirmeden bilgi edinmesini sa\u011flar.<\/li>\n<li><code>sortText<\/code> ve <code>filterText<\/code>: Bu alanlar, tamamlama listesinin nas\u0131l s\u0131ralanaca\u011f\u0131n\u0131 ve filtrelenece\u011fini kontrol eder. <code>sortText<\/code> alfabetik s\u0131ralama d\u0131\u015f\u0131nda \u00f6zel bir s\u0131ralama d\u00fczeni sa\u011flamak i\u00e7in kullan\u0131l\u0131rken, <code>filterText<\/code> kullan\u0131c\u0131n\u0131n yazd\u0131\u011f\u0131 metinle e\u015fle\u015fme mant\u0131\u011f\u0131n\u0131 \u00f6zelle\u015ftirmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-typescript\">\n\/\/ Geli\u015fmi\u015f tamamlama \u00f6\u011fesi \u00f6rne\u011fi\ncompletions.push({\n    label: 'log',\n    kind: CompletionItemKind.Method,\n    detail: '(method) console.log(...args: any[]): void', \/\/ Detayl\u0131 tip bilgisi\n    documentation: {\n        kind: 'markdown',\n        value: 'Bir mesaj\u0131 konsola yazar. Desteklenen seviyeler: <code>log<\/code>, <code>info<\/code>, <code>warn<\/code>, <code>error<\/code>.'\n    },\n    insertText: 'log(${1:message})', \/\/ Snippet tamamlama i\u00e7in\n    insertTextFormat: InsertTextFormat.Snippet,\n    sortText: '_log', \/\/ 'log' di\u011ferlerinden \u00f6nce gelsin diye\n    filterText: 'log' \/\/ Kullan\u0131c\u0131n\u0131n 'log' yazmas\u0131yla e\u015fle\u015fsin\n});\n<\/pre>\n<p><\/code><\/p>\n<p>Bu alanlar\u0131 etkin bir \u015fekilde kullanarak, dil sunucunuz sadece do\u011fru \u00f6nerileri sunmakla kalmaz, ayn\u0131 zamanda bu \u00f6nerilerin anla\u015f\u0131lmas\u0131n\u0131 ve etkili bir \u015fekilde kullan\u0131lmas\u0131n\u0131 da sa\u011flar.<\/p>\n<blockquote class=\"expert-tip\">\n<p>Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, <code>insertText<\/code> ve <code>insertTextFormat<\/code> alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<\/blockquote>\n<h2>\u0130leri D\u00fczey Tamamlama Senaryolar\u0131 ve Performans \u0130pu\u00e7lar\u0131<\/h2>\n<p>Temel tamamlama, bir dil sunucusunun ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r, ancak ger\u00e7ek d\u00fcnya projelerinde geli\u015ftiricilerin beklentileri \u00e7ok daha fazlas\u0131n\u0131 i\u00e7erir. \u0130leri d\u00fczey tamamlama senaryolar\u0131, dilin s\u00f6zdizimini, semanti\u011fini ve hatta projenin t\u00fcm ba\u011flam\u0131n\u0131 dikkate alarak daha ak\u0131ll\u0131 ve ilgili \u00f6neriler sunar. Bu t\u00fcr \u00f6zellikler, geli\u015ftirici verimlili\u011fini katlayarak art\u0131rabilir.<\/p>\n<ol>\n<li><strong>Ba\u011flam Duyarl\u0131 Tamamlama (Context-Aware Completion):<\/strong> Bu, en \u00f6nemli ileri d\u00fczey tamamlama t\u00fcrlerinden biridir. Sunucu, kullan\u0131c\u0131n\u0131n kodda bulundu\u011fu konumu (\u00f6rne\u011fin, bir s\u0131n\u0131f\u0131n i\u00e7inde mi, bir fonksiyonun parametresi olarak m\u0131, yoksa bir nesnenin \u00f6zelli\u011fi olarak m\u0131) analiz eder ve yaln\u0131zca o ba\u011flamda ge\u00e7erli olan \u00f6nerileri sunar. \u00d6rne\u011fin, bir nesne de\u011fi\u015fkeninin ard\u0131ndan nokta (<code>.<\/code>) karakteri yaz\u0131ld\u0131\u011f\u0131nda, LSP sunucusu o nesnenin sadece eri\u015filebilir \u00f6zelliklerini ve metotlar\u0131n\u0131 \u00f6nermelidir. Bu, dilin bir Soyut S\u00f6zdizimi A\u011fac\u0131'n\u0131 (AST - Abstract Syntax Tree) veya sembol tablosunu (symbol table) kullanarak m\u00fcmk\u00fcn olur.<\/li>\n<li><strong>Lazy Resolution (Tembel \u00c7\u00f6z\u00fcmleme):<\/strong> B\u00fcy\u00fck kod tabanlar\u0131nda veya \u00e7ok say\u0131da potansiyel tamamlama \u00f6\u011fesi oldu\u011funda, her tamamlama iste\u011finde t\u00fcm \u00f6\u011felerin detayl\u0131 dok\u00fcmantasyonunu veya ek bilgilerini hesaplamak performans\u0131 olumsuz etkileyebilir. LSP, <code>resolveProvider<\/code> \u00f6zelli\u011fini <code>true<\/code> olarak ayarlayarak ve <code>connection.onCompletionResolve<\/code> i\u015fleyicisini kullanarak bu sorunu \u00e7\u00f6zer. Bu sayede, ilk tamamlama iste\u011finde sadece temel bilgiler (label, kind) g\u00f6nderilir. Kullan\u0131c\u0131 bir \u00f6\u011feyi vurgulad\u0131\u011f\u0131nda veya se\u00e7ti\u011finde, edit\u00f6r ayr\u0131 bir <code>completionItem\/resolve<\/code> iste\u011fi g\u00f6nderir ve sunucu bu \u00f6\u011feye \u00f6zel detayl\u0131 bilgileri (documentation, detail vb.) o anda hesaplar ve geri g\u00f6nderir. Bu, ilk tamamlama yan\u0131t\u0131n\u0131n h\u0131zl\u0131 olmas\u0131n\u0131 sa\u011flar ve kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/li>\n<\/ol>\n<h3>Vaka Analizi: JSON \u015eemas\u0131na G\u00f6re Ak\u0131ll\u0131 Tamamlama<\/h3>\n<p>Bir dil sunucusunun ba\u011flam duyarl\u0131 tamamlama yetene\u011fi, sadece geleneksel programlama dilleriyle s\u0131n\u0131rl\u0131 de\u011fildir. \u00d6rne\u011fin, bir JSON dosyas\u0131n\u0131 d\u00fczenlerken, bir <code>package.json<\/code> dosyas\u0131nda <code>dependencies<\/code> objesinin i\u00e7ine paket isimleri \u00f6nerilmesi veya bir <code>scripts<\/code> objesinin i\u00e7ine ge\u00e7erli script komutlar\u0131 \u00f6nerilmesi b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Bu senaryoda, LSP sunucusu, JSON dosyas\u0131n\u0131n ba\u011fl\u0131 oldu\u011fu JSON \u015femas\u0131n\u0131 (<code>$schema<\/code> alan\u0131 ile belirtilen) okur ve imlecin bulundu\u011fu konumdaki \u015fema tan\u0131m\u0131na g\u00f6re ge\u00e7erli anahtarlar\u0131 veya de\u011ferleri \u00f6nerir.<\/p>\n<p>Diyelim ki bir <code>package.json<\/code> dosyas\u0131nda \u00e7al\u0131\u015f\u0131yoruz:<\/p>\n<pre><code class=\"language-json\">\n{\n  \"name\": \"my-app\",\n  \"version\": \"1.0.0\",\n  \"dependencies\": {\n    \"react\": \"^18.2.0\",\n    \"axios\": \"^1.4.0\"\n  },\n  \"scripts\": {\n    \"start\": \"react-scripts start\",\n    \"build\": \"react-scripts build\",\n    \"test\": \"react-scripts test\",\n    \"eject\": \"react-scripts eject\"\n  }\n}\n<\/pre>\n<p><\/code><br \/>\nE\u011fer kullan\u0131c\u0131 <code>\"dep\"<\/code> yazd\u0131ktan sonra Ctrl+Space (veya e\u015fde\u011feri) basarsa, LSP sunucusu <code>dependencies<\/code> anahtar\u0131n\u0131 \u00f6nerebilir. Ard\u0131ndan <code>dependencies: { \"r\"<\/code> yaz\u0131ld\u0131\u011f\u0131nda, bilinen npm paketlerinden <code>react<\/code> veya <code>redux<\/code> gibi \u00f6neriler sunulabilir. Bu, LSP sunucusunun sadece metinsel e\u015fle\u015fmelerle de\u011fil, ayn\u0131 zamanda verinin yap\u0131sal ba\u011flam\u0131yla da \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131n bir g\u00f6stergesidir.<\/p>\n<h3>Performans Optimizasyonu \u0130pu\u00e7lar\u0131:<\/h3>\n<ul>\n<li><strong>\u00d6nbellekleme (Caching):<\/strong> Tamamlama \u00f6nerileri genellikle s\u0131k\u00e7a tekrar eden veriler i\u00e7erir (anahtar kelimeler, standart k\u00fct\u00fcphane fonksiyonlar\u0131). Bu t\u00fcr verileri \u00f6nbellekte tutmak, her istekte yeniden hesaplama maliyetini ortadan kald\u0131r\u0131r. \u00d6zellikle <code>onCompletionResolve<\/code> ile getirilen detayl\u0131 bilgiler i\u00e7in \u00f6nbellekleme yapmak performans\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/li>\n<li><strong>Sonu\u00e7lar\u0131 S\u0131n\u0131rlama:<\/strong> Baz\u0131 durumlarda, y\u00fczlerce veya binlerce tamamlama \u00f6nerisi olabilir. Edit\u00f6rlerin kullan\u0131c\u0131 aray\u00fcz\u00fc bu kadar \u00e7ok \u00f6\u011feyi verimli bir \u015fekilde i\u015fleyemeyebilir. Sunucu taraf\u0131nda sonu\u00e7 say\u0131s\u0131n\u0131 s\u0131n\u0131rlamak (\u00f6rne\u011fin ilk 50 veya 100 \u00f6neriyle) ve <code>isIncomplete: true<\/code> bayra\u011f\u0131n\u0131 ayarlayarak daha fazla sonu\u00e7 i\u00e7in istemciyi tekrar istek g\u00f6ndermeye te\u015fvik etmek iyi bir stratejidir.<\/li>\n<li><strong>Asenkron \u0130\u015fleme ve Throttling:<\/strong> Tamamlama istekleri \u00e7ok s\u0131k gelebilir (her tu\u015f vuru\u015funda). Sunucunun bu istekleri asenkron olarak i\u015flemesi ve arka planda hesaplamalar\u0131 yapmas\u0131 \u00f6nemlidir. Ayr\u0131ca, bir kullan\u0131c\u0131 h\u0131zla yazarken arka arkaya gelen istekleri <code>throttle<\/code> (k\u0131s\u0131tlama) veya <code>debounce<\/code> (gecikmeli \u00e7al\u0131\u015ft\u0131rma) teknikleri ile kontrol etmek, gereksiz hesaplamalar\u0131 \u00f6nleyerek sunucu y\u00fck\u00fcn\u00fc azalt\u0131r.<\/li>\n<\/ul>\n<blockquote class=\"expert-tip\">\n<p>Uzman \u0130pucu: B\u00fcy\u00fck projelerde veya kaynak yo\u011fun dillerde, tamamlama \u00f6nerilerini hesaplamak zaman alabilir. Bu durumda, <code>isIncomplete: true<\/code> bayra\u011f\u0131n\u0131 etkin bir \u015fekilde kullanarak, ilk a\u015famada h\u0131zl\u0131ca az say\u0131da temel \u00f6neri d\u00f6nd\u00fcr\u00fcp, ard\u0131ndan kullan\u0131c\u0131 biraz daha bekledi\u011finde veya kayd\u0131rd\u0131\u011f\u0131nda daha fazla veya daha detayl\u0131 \u00f6nerileri getiren bir strateji izleyebilirsiniz. Bu, \u00f6zellikle Visual Studio Code gibi edit\u00f6rlerde ak\u0131c\u0131 bir deneyim sunar.<\/p>\n<\/blockquote>\n<p>Bu ileri d\u00fczey yakla\u015f\u0131mlar ve performans ipu\u00e7lar\u0131, bir dil sunucusunun sadece fonksiyonel olmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda geli\u015ftiriciler i\u00e7in h\u0131zl\u0131 ve duyarl\u0131 bir ara\u00e7 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Mobil Uyumluluk ve Dil Sunucular\u0131: Neden Medya Sorgular\u0131 \u00d6nemli?<\/h2>\n<p>Bir programlama dili sunucusunun temel g\u00f6revi, belirli bir dilin s\u00f6zdizimi ve semanti\u011fi hakk\u0131nda geli\u015ftiricilere bilgi sa\u011flamakt\u0131r. Peki, bu ba\u011flamda \"mobil uyumluluk\" ve \"medya sorgular\u0131\" neden \u00f6nemli bir tart\u0131\u015fma konusu haline gelir? Her ne kadar Dil Sunucusu Protokol\u00fc (LSP) do\u011frudan mobil uygulama geli\u015ftirme veya responsive tasar\u0131m ara\u00e7lar\u0131 sunmasa da, web tabanl\u0131 diller (HTML, CSS, JavaScript) i\u00e7in geli\u015ftirilen LSP sunucular\u0131, geli\u015ftiricilerin bu alandaki g\u00f6revlerini kolayla\u015ft\u0131rabilir ve dolayl\u0131 yoldan mobil uyumlu kod yaz\u0131m\u0131na katk\u0131da bulunabilir.<\/p>\n<p>Modern web geli\u015ftirmenin temel ta\u015flar\u0131ndan biri olan responsive tasar\u0131m, farkl\u0131 ekran boyutlar\u0131na ve cihazlara (masa\u00fcst\u00fc, tablet, mobil) uyum sa\u011flayabilen web sayfalar\u0131 olu\u015fturma prati\u011fidir. Bu uyum genellikle CSS i\u00e7inde <code>@media<\/code> kurallar\u0131, yani medya sorgular\u0131 kullan\u0131larak sa\u011flan\u0131r. Medya sorgular\u0131, taray\u0131c\u0131n\u0131n g\u00f6r\u00fcnt\u00fcleme alan\u0131n\u0131n geni\u015fli\u011fi, y\u00fcksekli\u011fi, cihaz\u0131n y\u00f6n\u00fc (yatay\/dikey) gibi \u00f6zelliklere g\u00f6re farkl\u0131 stil kurallar\u0131n\u0131n uygulanmas\u0131n\u0131 sa\u011flar.<\/p>\n<p>Bir CSS dil sunucusu, medya sorgular\u0131n\u0131n yaz\u0131m\u0131n\u0131 ve y\u00f6netimini geli\u015ftiriciler i\u00e7in \u00e7ok daha kolay hale getirebilir. \u0130\u015fte LSP'nin bu noktada nas\u0131l bir rol oynayabilece\u011fine dair baz\u0131 senaryolar:<\/p>\n<ol>\n<li><strong>Medya Sorgusu S\u00f6zdizimi Tamamlama:<\/strong> Geli\u015ftiriciler <code>@media<\/code> yazmaya ba\u015flad\u0131\u011f\u0131nda, LSP sunucusu otomatik olarak <code>screen<\/code>, <code>(min-width: ...)<\/code> veya <code>(max-width: ...)<\/code> gibi temel medya \u00f6zellikleri ve operat\u00f6rleri i\u00e7in \u00f6neriler sunabilir. Bu, \u00f6zellikle medya sorgular\u0131n\u0131n s\u00f6zdizimine a\u015fina olmayanlar i\u00e7in veya karma\u015f\u0131k sorgular olu\u015ftururken yaz\u0131m hatalar\u0131n\u0131 \u00f6nler.<\/li>\n<li><strong>Ba\u011flamsal \u00d6zellik \u00d6nerileri:<\/strong> Bir <code>@media<\/code> blo\u011funun i\u00e7indeyken, LSP sunucusu o ba\u011flama \u00f6zel CSS \u00f6zellikleri veya de\u011ferleri \u00f6nerebilir. \u00d6rne\u011fin, <code>(max-width: 768px)<\/code> i\u00e7inde bir CSS kural\u0131 yazarken, sunucu mobil cihazlar i\u00e7in daha uygun olabilecek <code>font-size: 14px;<\/code> veya <code>flex-direction: column;<\/code> gibi de\u011ferleri \u00f6ncelikli olarak \u00f6nerebilir. Bu, geli\u015ftiricinin farkl\u0131 cihaz boyutlar\u0131 i\u00e7in en uygun stilleri hat\u0131rlamas\u0131na veya ke\u015ffetmesine yard\u0131mc\u0131 olur.<\/li>\n<li><strong>Hata Denetimi ve Linting:<\/strong> Bir CSS LSP sunucusu, ge\u00e7ersiz medya sorgusu s\u00f6zdizimini veya medya sorgular\u0131 i\u00e7inde anlams\u0131z CSS \u00f6zelliklerini (\u00f6rne\u011fin, yaln\u0131zca ekran i\u00e7in ge\u00e7erli olan bir \u00f6zelli\u011fi <code>print<\/code> medyas\u0131nda kullanmak) tespit edebilir ve geli\u015ftiriciye an\u0131nda geri bildirim sa\u011flayabilir.<\/li>\n<li><strong>Dok\u00fcmantasyon ve A\u00e7\u0131klama:<\/strong> Medya \u00f6zelliklerinin ne anlama geldi\u011fi veya hangi de\u011ferleri alabilece\u011fi hakk\u0131nda detayl\u0131 dok\u00fcmantasyonu, tamamlama \u00f6nerileriyle birlikte sunmak, geli\u015ftiricilerin daha bilin\u00e7li kararlar almas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ol>\n<p>A\u015fa\u011f\u0131daki CSS medya sorgusu \u00f6rne\u011fi, bir LSP sunucusunun bu ba\u011flamda nas\u0131l de\u011fer katabilece\u011fini g\u00f6stermektedir:<\/p>\n<pre><code class=\"language-css\">\n.container {\n  width: 90%;\n  margin: 0 auto;\n  padding: 10px;\n}\n\n@media (min-width: 600px) { \/* Tablet ve \u00fczeri cihazlar i\u00e7in *\/\n  .container {\n    max-width: 580px;\n    \/* LSP burada 'display: flex;' veya 'grid-template-columns: 1fr 1fr;' gibi\n       tablet boyutlar\u0131na uygun layout \u00f6nerileri sunabilir. *\/\n    \/* \u00d6rne\u011fin: *\/\n    \/* display: flex; *\/\n    \/* justify-content: center; *\/\n  }\n}\n\n@media (min-width: 992px) { \/* Masa\u00fcst\u00fc cihazlar i\u00e7in *\/\n  .container {\n    max-width: 960px;\n    padding: 20px;\n    \/* LSP, daha b\u00fcy\u00fck ekranlara \u00f6zel karma\u015f\u0131k grid yap\u0131lar\u0131 veya animasyonlar i\u00e7in\n       farkl\u0131 \u00f6neriler sunabilir. *\/\n  }\n}\n\n\/* Ayr\u0131ca, landscape (yatay) mod i\u00e7in de \u00f6neriler sunulabilir *\/\n@media screen and (orientation: landscape) {\n  .header {\n    height: 80px;\n    \/* LSP, yatay modda daha geni\u015f bir ba\u015fl\u0131k alan\u0131 \u00f6nerebilir *\/\n  }\n}\n<\/pre>\n<p><\/code><br \/>\nYukar\u0131daki \u00f6rnekte, bir CSS LSP sunucusu, <code>@media<\/code> bloklar\u0131n\u0131n i\u00e7indeki kod ba\u011flam\u0131na g\u00f6re farkl\u0131 tamamlama \u00f6nerileri sunabilir. \u00d6rne\u011fin, <code>(min-width: 600px)<\/code> i\u00e7indeyken, <code>display<\/code> \u00f6zelli\u011fi i\u00e7in <code>flex<\/code> veya <code>grid<\/code> gibi layout de\u011ferleri \u00f6ncelikli olarak \u00f6nerilebilir. Bu, geli\u015ftiricinin farkl\u0131 cihaz tipleri i\u00e7in \u00f6zel stil kurallar\u0131 yazarken do\u011fru ve optimize edilmi\u015f se\u00e7imler yapmas\u0131na yard\u0131mc\u0131 olur. LSP'nin bu dolayl\u0131 rol\u00fc, dil sunucular\u0131n\u0131n sadece kodun do\u011frulu\u011funa de\u011fil, ayn\u0131 zamanda tasar\u0131m\u0131n ve kullan\u0131c\u0131 deneyiminin kalitesine de katk\u0131da bulunabilece\u011fini g\u00f6sterir. Bu, LSP'nin sadece programlama dillerine de\u011fil, stil dillerine de uygulanabilirli\u011finin ve geli\u015ftirici ara\u00e7lar\u0131 ekosistemindeki merkezi rol\u00fcn\u00fcn \u00f6nemli bir kan\u0131t\u0131d\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Dil Sunucusu Protokol\u00fc (LSP), modern geli\u015ftirme ortamlar\u0131n\u0131n vazge\u00e7ilmez bir par\u00e7as\u0131 haline gelmi\u015f, farkl\u0131 edit\u00f6rler ve IDE'ler aras\u0131nda tutarl\u0131 ve zengin bir geli\u015ftirici deneyimi sunman\u0131n anahtar\u0131 olmu\u015ftur. Bu makalede, LSP'nin en temel ve en \u00e7ok kullan\u0131lan \u00f6zelliklerinden biri olan \"temel tamamlama\" (basic completion) \u00fczerine odakland\u0131k. <code>textDocument\/completion<\/code> iste\u011finin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, istemci ve sunucu aras\u0131ndaki veri ak\u0131\u015f\u0131n\u0131 ve tamamlama \u00f6\u011felerinin (<code>CompletionItem<\/code>) <code>detail<\/code>, <code>documentation<\/code>, <code>kind<\/code> gibi zengin alanlarla nas\u0131l daha anlaml\u0131 hale getirilebilece\u011fini ad\u0131m ad\u0131m inceledik. Ayr\u0131ca, JSON \u015femas\u0131 tabanl\u0131 ak\u0131ll\u0131 tamamlama gibi ger\u00e7ek d\u00fcnya senaryolar\u0131yla ileri d\u00fczey yakla\u015f\u0131mlara ve performans\u0131 optimize etmek i\u00e7in <code>lazy resolution<\/code> ve \u00f6nbellekleme gibi ipu\u00e7lar\u0131na de\u011findik. Son olarak, LSP'nin do\u011frudan mobil uyumluluk ara\u00e7lar\u0131 sunmasa da, CSS gibi web dilleri i\u00e7in geli\u015ftirilen sunucular\u0131n medya sorgular\u0131 arac\u0131l\u0131\u011f\u0131yla responsive tasar\u0131m s\u00fcre\u00e7lerini nas\u0131l kolayla\u015ft\u0131rabilece\u011fini g\u00f6sterdik. Kendi dil sunucunuzu geli\u015ftirirken, bu prensipleri uygulayarak geli\u015ftiricilere sadece hatas\u0131z de\u011fil, ayn\u0131 zamanda keyifli ve verimli bir kodlama deneyimi sunabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<dl>\n<dt>Q1: Tamamlama performans\u0131 nas\u0131l art\u0131r\u0131l\u0131r?<\/dt>\n<dd>A1: Performans\u0131 art\u0131rmak i\u00e7in birka\u00e7 strateji vard\u0131r:<\/p>\n<ul>\n<li><strong>\u00d6nbellekleme:<\/strong> S\u0131k\u00e7a istenen veya statik tamamlama \u00f6\u011felerini \u00f6nbellekte tutun.<\/li>\n<li><strong>Lazy Resolution (<code>onCompletionResolve<\/code>):<\/strong> \u0130lk tamamlama iste\u011finde sadece gerekli temel bilgileri g\u00f6nderin, detayl\u0131 bilgileri (dok\u00fcmantasyon gibi) kullan\u0131c\u0131 \u00f6\u011feyi se\u00e7ti\u011finde veya \u00fczerine geldi\u011finde <code>onCompletionResolve<\/code> kullanarak y\u00fckleyin.<\/li>\n<li><strong>Throttling\/Debouncing:<\/strong> \u00c7ok s\u0131k gelen istekleri y\u00f6netmek i\u00e7in <code>throttle<\/code> veya <code>debounce<\/code> tekniklerini uygulay\u0131n.<\/li>\n<li><strong>Sonu\u00e7lar\u0131 S\u0131n\u0131rlama:<\/strong> \u00c7ok say\u0131da tamamlama \u00f6\u011fesi d\u00f6nd\u00fcrmekten ka\u00e7\u0131n\u0131n; <code>isIncomplete: true<\/code> ile daha fazla \u00f6\u011fenin mevcut oldu\u011funu belirtin.<\/li>\n<\/ul>\n<\/dd>\n<dt>Q2: Temel tamamlama ve ak\u0131ll\u0131 tamamlama aras\u0131ndaki fark nedir?<\/dt>\n<dd>A2: <strong>Temel tamamlama<\/strong>, genellikle statik anahtar kelimeler, basit de\u011fi\u015fken isimleri veya \u00f6nceden tan\u0131mlanm\u0131\u015f listelerden \u00f6neriler sunar. Daha az ba\u011flam analizi gerektirir. <strong>Ak\u0131ll\u0131 tamamlama<\/strong> ise, dilin Soyut S\u00f6zdizimi A\u011fac\u0131'n\u0131 (AST) veya sembol tablosunu kullanarak mevcut kodun ba\u011flam\u0131n\u0131 (\u00f6rne\u011fin, hangi nesnenin \u00fcyeleri, hangi fonksiyonun parametreleri gibi) derinlemesine analiz eder ve buna g\u00f6re tip \u00e7\u0131kar\u0131m\u0131, API dok\u00fcmantasyonu veya \u00f6zel dil yap\u0131lar\u0131na dayal\u0131 olarak ilgili ve do\u011fru \u00f6neriler sunar.<\/dd>\n<dt>Q3: Kendi dilim i\u00e7in LSP sunucusu yazarken nelere dikkat etmeliyim?<\/dt>\n<dd>A3:<\/p>\n<ul>\n<li><strong>Dilin S\u00f6zdizimi Analizi:<\/strong> Dilinizin bir ayr\u0131\u015ft\u0131r\u0131c\u0131s\u0131n\u0131 (parser) ve m\u00fcmk\u00fcnse bir Soyut S\u00f6zdizimi A\u011fac\u0131 (AST) olu\u015fturucusunu geli\u015ftirmelisiniz. Bu, ba\u011flam duyarl\u0131 \u00f6zellikler i\u00e7in temeldir.<\/li>\n<li><strong>LSP Standartlar\u0131na Uyum:<\/strong> Protokol\u00fcn spesifikasyonlar\u0131na s\u0131k\u0131 s\u0131k\u0131ya uyun.<\/li>\n<li><strong>Performans ve \u00d6l\u00e7eklenebilirlik:<\/strong> B\u00fcy\u00fck kod tabanlar\u0131nda bile h\u0131zl\u0131 yan\u0131t s\u00fcreleri sa\u011flamak i\u00e7in performans optimizasyonlar\u0131na (\u00f6nbellekleme, tembel \u00e7\u00f6z\u00fcmleme) \u00f6ncelik verin.<\/li>\n<li><strong>Hata Y\u00f6netimi:<\/strong> Sunucunuzun beklenmedik durumlar\u0131 ve hatalar\u0131 d\u00fczg\u00fcn bir \u015fekilde y\u00f6netti\u011finden emin olun.<\/li>\n<\/ul>\n<\/dd>\n<dt>Q4: LSP sadece kod tamamlama i\u00e7in mi kullan\u0131l\u0131r?<\/dt>\n<dd>A4: Hay\u0131r, kod tamamlama LSP'nin en g\u00f6r\u00fcn\u00fcr ve pop\u00fcler \u00f6zelliklerinden biri olsa da, protokol \u00e7ok daha geni\u015f bir yelpazede dil hizmetlerini destekler. Bunlar aras\u0131nda tan\u0131ma gitme (Go to Definition), referanslar\u0131 bulma (Find References), sembolleri yeniden adland\u0131rma (Rename Symbol), kod formatlama, hata ve uyar\u0131 denetimi (Diagnostics), imle\u00e7 \u00fczerine gelindi\u011finde bilgi g\u00f6sterme (Hover) ve kod eylemleri (Code Actions) gibi \u00f6zellikler bulunur.<\/dd>\n<dt>Q5: Mobil uyumluluk \u00f6rnekleri neden bir LSP makalesinde yer ald\u0131?<\/dt>\n<dd>A5: Bu \u00f6rnekler, LSP'nin sadece programlama dillerine de\u011fil, CSS gibi stil dillerine de uygulanabilece\u011fini ve medya sorgular\u0131 gibi ba\u011flamlarda geli\u015ftiriciye nas\u0131l yard\u0131mc\u0131 olabilece\u011fini g\u00f6stermek amac\u0131yla eklenmi\u015ftir. Bir CSS dil sunucusu, medya sorgular\u0131n\u0131n do\u011fru yaz\u0131lmas\u0131na, ba\u011flama uygun stil \u00f6nerileri sunmas\u0131na ve responsive tasar\u0131m s\u00fcrecini kolayla\u015ft\u0131rmas\u0131na yard\u0131mc\u0131 olarak dolayl\u0131 yoldan mobil uyumlu web geli\u015ftiricili\u011fine katk\u0131da bulunabilir.<\/dd>\n<\/dl>\n","protected":false},"excerpt":{"rendered":"Geli\u015ftiricilerin g\u00fcnl\u00fck kod yazma deneyimini k\u00f6kten de\u011fi\u015ftiren Dil Sunucusu Protokol\u00fc (LSP), modern IDE&#8217;lerin ve kod edit\u00f6rlerinin vazge\u00e7ilmez bir&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32204","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)<\/title>\n<meta name=\"description\" content=\"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)\" \/>\n<meta property=\"og:description\" content=\"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-18T21:01:23+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)\",\"datePublished\":\"2025-10-18T21:01:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\"},\"wordCount\":3840,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\",\"name\":\"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-18T21:01:23+00:00\",\"description\":\"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)","description":"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/","og_locale":"tr_TR","og_type":"article","og_title":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)","og_description":"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.","og_url":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-18T21:01:23+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"24 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)","datePublished":"2025-10-18T21:01:23+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/"},"wordCount":3840,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/","url":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/","name":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-18T21:01:23+00:00","description":"Uzman \u0130pucu: Tamamlama \u00f6\u011felerini zenginle\u015ftirirken, `insertText` ve `insertTextFormat` alanlar\u0131n\u0131 kullanarak kod par\u00e7ac\u0131klar\u0131 (snippets) sunabilirsiniz. Bu sayede, kullan\u0131c\u0131 bir tamamlama \u00f6\u011fesini se\u00e7ti\u011finde, sadece bir kelime de\u011fil, \u00f6nceden tan\u0131mlanm\u0131\u015f bir kod blo\u011fu otomatik olarak eklenir. \u00d6zellikle fonksiyon \u00e7a\u011fr\u0131lar\u0131 veya karma\u015f\u0131k yap\u0131lar\u0131n h\u0131zl\u0131ca yaz\u0131lmas\u0131 i\u00e7in bu \u00f6zellik b\u00fcy\u00fck kolayl\u0131k sa\u011flar.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/dil-sunucusu-protokolu-ile-temel-tamamlama-kapsamli-rehber-part-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dil Sunucusu Protokol\u00fc ile Temel Tamamlama: Kapsaml\u0131 Rehber (Part 5)"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32204"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32204\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}