diff --git a/script/core/completion.lua b/script/core/completion.lua
index d4f773686de6277797191b914b027640e1875b17..a899ec5c550cf2c6ff8d30f9c0e86ba6c68c9b0f 100644
--- a/script/core/completion.lua
+++ b/script/core/completion.lua
@@ -633,6 +633,7 @@ local function checkCommon(myUri, word, text, offset, results)
         used[data[1]] = true
     end
     if config.get 'Lua.completion.workspaceWord' and #word >= 2 then
+        results.complete = true
         local myHead = word:sub(1, 2)
         for uri in files.eachFile() do
             if #results >= 100 then
@@ -697,6 +698,9 @@ local function checkCommon(myUri, word, text, offset, results)
             end
         end
     end
+    if #results >= 100 then
+        results.complete = false
+    end
 end
 
 local function isInString(ast, offset)
diff --git a/script/core/folding.lua b/script/core/folding.lua
index dad9842205dfd1542288779b53a17405535542df..51d1be6b1d7b94d7d113f250a41ce95fecefd8a2 100644
--- a/script/core/folding.lua
+++ b/script/core/folding.lua
@@ -1,6 +1,7 @@
 local files = require "files"
 local guide = require "parser.guide"
 local util  = require 'utility'
+local await = require 'await'
 
 local Care = {
     ['function'] = function (source, text, results)
@@ -156,12 +157,14 @@ return function (uri)
     guide.eachSource(ast.ast, function (source)
         local tp = source.type
         if Care[tp] then
+            await.delay()
             Care[tp](source, text, regions)
         end
     end)
     for _, source in ipairs(ast.comms) do
         local tp = source.type
         if Care[tp] then
+            await.delay()
             Care[tp](source, text, regions, status)
         end
     end
diff --git a/script/core/semantic-tokens.lua b/script/core/semantic-tokens.lua
index ce869ed180f5041ce70d308aad618278025b45f4..96cbc5e18416ebd171fd458f2927dd6da33f22aa 100644
--- a/script/core/semantic-tokens.lua
+++ b/script/core/semantic-tokens.lua
@@ -221,17 +221,13 @@ return function (uri, start, finish)
     end
 
     local results = {}
-    local count = 0
     guide.eachSourceBetween(ast.ast, start, finish, function (source)
         local method = Care[source.type]
         if not method then
             return
         end
         method(source, results)
-        count = count + 1
-        if count % 100 == 0 then
-            await.delay()
-        end
+        await.delay()
     end)
 
     for _, comm in ipairs(ast.comms) do
diff --git a/script/files.lua b/script/files.lua
index 93331bb5055e36614f52af418d3b055e0f8ad332..2c8ea829dfb76a50b9b3d3ebf965595d6ff704b2 100644
--- a/script/files.lua
+++ b/script/files.lua
@@ -184,7 +184,7 @@ function m.setText(uri, text, isTrust, instance)
         await.call(function ()
             await.close('update:' .. uri)
             await.setID('update:' .. uri)
-            await.delay()
+            await.sleep(0.2)
             if m.exists(uri) then
                 m.onWatch('update', uri)
             end
diff --git a/script/provider/provider.lua b/script/provider/provider.lua
index fe044fc5702f50ec66854be70dec212f4c341011..09a031ccb8dbde43e4e9df0ec1b645f59561f323 100644
--- a/script/provider/provider.lua
+++ b/script/provider/provider.lua
@@ -470,7 +470,7 @@ proto.on('textDocument/completion', function (params)
         items[i] = item
     end
     return {
-        isIncomplete = true,
+        isIncomplete = not result.complete,
         items        = items,
     }
 end)
@@ -682,6 +682,8 @@ end)
 
 proto.on('textDocument/semanticTokens/full', function (params)
     workspace.awaitReady()
+    await.close('textDocument/semanticTokens/full')
+    await.setID('textDocument/semanticTokens/full')
     local _ <close> = progress.create(lang.script.WINDOW_PROCESSING_SEMANTIC_FULL, 0.5)
     local core = require 'core.semantic-tokens'
     local uri = params.textDocument.uri
@@ -697,6 +699,8 @@ end)
 
 proto.on('textDocument/semanticTokens/range', function (params)
     workspace.awaitReady()
+    await.close('textDocument/semanticTokens/range')
+    await.setID('textDocument/semanticTokens/range')
     local _ <close> = progress.create(lang.script.WINDOW_PROCESSING_SEMANTIC_RANGE, 0.5)
     local core = require 'core.semantic-tokens'
     local uri = params.textDocument.uri
@@ -722,6 +726,8 @@ proto.on('textDocument/foldingRange', function (params)
     if not files.exists(uri) then
         return nil
     end
+    await.close('textDocument/foldingRange')
+    await.setID('textDocument/foldingRange')
     local regions = core(uri)
     if not regions then
         return nil