[投票] `foo` `foo(` or `foo()` 函數補全方式

ccls補全函數時,除了identifier外,還會補全出(和(可選的)snippets。函數是否帶參數,會影響補全出來的內容:

  • int bar() {}: 補全出bar()
  • int foo(int a, int b) {} (帶參數): 檢查 completion.completionItem.snippetSupport && client.snippetSupport爲:
    • true: foo(${1:int a}, ${2:int b})$0 。即language client支援snippet且initialization option client.snippetSupport允許。
    • false: foo(

https://github.com/MaskRay/ccls/issues/412 有些人似乎希望把foo(改成foo

我想調查下多少人使用snippet (使用emacs-ccls的話,可以 (setq ccls-initialization-options '(:client (:snippetSupport :json-false)))強制關閉,即使lsp-mode支援(假如安裝了yasnippets))

  • 使用snippet
  • 不用snippet

0 投票人

假如使用不支援snippet的編輯器/language client,你希望函數foo(帶參數)以哪種方式補全出來:

  • foo
  • foo(
  • foo()

0 投票人

假如使用不支援snippet的編輯器/language client,你希望函數bar(無參數)以哪種方式補全出來:

  • bar
  • bar(
  • bar()

0 投票人

关于第三个投票

请问他能检测bar的返回值吗?

如果返回值是void 的话,最后加个分号也是可行的

但是如果能让用户去配置这些的话不就更好了吗?

往更远处走一点,让用户加hook,并给予默认值也是可行的

当不支持snippets,且补全foo()时,光标位置是foo(|)还是foo()|

带参数 foo(|)

无参数 foo()|

lsp似乎不能发送让客户端移动光标的指令?

不满意的方法我都是加 advice,我的配置文件有好多 advice。。。

哦对,lsp只是给company一个candidate,company不用snippet的话没法移动光标?

我的都是

(with-eval-after-load "python"

謝謝投票。我決定把補全樣式設計成這樣 (Add initialization option completion.placeholder; change client.snippetSupport: false to drop ( and < by MaskRay · Pull Request #497 · MaskRay/ccls · GitHub):

  • client.snippetSupport: false => foo
  • client.snippetSupport: true
    • completion.placeholder: false => foo($1)$0 qux<$1>()$0
    • completion.placeholder: true => foo(${1:int a}, ${2:int b})$0 qux<${1:typename T}>()$0

無參數的bar沒有bar()

1 个赞

还是让用户可配置的好

可以提供lsp协议之外的东西

顺便问一下 如果是json的配置文件 可以加注释吗

JSON规范里是不允许有注释的

写配置用什么json,辣眼睛,不如用yaml/toml

那lsp协议用的是什么

我觉得配置文件应该是可以动态改变的

想变就变不是更好吗

JSON适合数据交换, 人类可读性很差,而且默认规范里连注释这种基本的东西都没有,一个workaround是

"_comment": "I have to add comment like this"

用脚本语言不是更好?

微软用的支持注释的 JSON 变体,好像叫 CSON,除多了注释外没别的功能。

谢谢 看来微软想的和我一样