Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Code completion for blocks is unhelpful due to cursor placement #2971

Open
thedanbob opened this issue Dec 11, 2024 · 1 comment
Open

Code completion for blocks is unhelpful due to cursor placement #2971

thedanbob opened this issue Dec 11, 2024 · 1 comment
Labels
bug Something isn't working

Comments

@thedanbob
Copy link

thedanbob commented Dec 11, 2024

Description

Ruby LSP Information

VS Code Version

1.95.3

Ruby LSP Extension Version

0.8.16

Ruby LSP Server Version

0.22.1

Ruby LSP Addons

  • Ruby LSP Rails

Ruby Version

3.3.6

Ruby Version Manager

custom

Installed Extensions

Click to expand
  • amx-netlinx (0.6.1)
  • better-toml (0.3.2)
  • copy-text (0.4.9)
  • cpptools (1.22.11)
  • csharp (2.55.29)
  • elixir-ls (0.24.2)
  • gitlens (16.0.5)
  • go (0.42.1)
  • haml (1.4.1)
  • isort (2023.10.1)
  • material-icon-theme (5.15.0)
  • platformio-ide (3.3.3)
  • postcss (2.0.0)
  • python (2024.20.0)
  • ruby-lsp (0.8.16)
  • rust-analyzer (0.3.2212)
  • vscode-ansi (1.1.7)
  • vscode-dotnet-runtime (2.2.3)
  • vscode-eslint (3.0.10)
  • vscode-npm-script (0.3.29)
  • vscode-projects-plus (1.24.0)
  • vscode-zipfs (3.0.0)

Ruby LSP Settings

Click to expand
Workspace
{}
User
{
  "enabledFeatures": {
    "codeActions": true,
    "diagnostics": true,
    "documentHighlights": true,
    "documentLink": true,
    "documentSymbols": true,
    "foldingRanges": true,
    "formatting": true,
    "hover": true,
    "inlayHint": true,
    "onTypeFormatting": true,
    "selectionRanges": true,
    "semanticHighlighting": true,
    "completion": true,
    "codeLens": true,
    "definition": true,
    "workspaceSymbol": true,
    "signatureHelp": true,
    "typeHierarchy": true
  },
  "featuresConfiguration": {},
  "addonSettings": {},
  "rubyVersionManager": {
    "identifier": "custom"
  },
  "customRubyCommand": "rbenv init - fish | source",
  "formatter": "auto",
  "linters": null,
  "bundleGemfile": "",
  "testTimeout": 30,
  "branch": "",
  "pullDiagnosticsOn": "both",
  "useBundlerCompose": false,
  "bypassTypechecker": false,
  "rubyExecutablePath": "",
  "indexing": {},
  "erbSupport": true,
  "featureFlags": {}
}

Reproduction steps

ruby-lsp auto-completes ruby blocks which is potentially a great feature, but the implementation is not quite there. Examples:

  • Type method do |. ruby-lsp autocompletes the argument pipes to method do ||, but the cursor is after the closing pipe, so attempting to finish typing e.g. |a| results in method do ||a||. You have to remember to arrow left before typing the argument.
  • Type def method_name<enter>. ruby-lsp autocompletes the method structure with an empty line and end, but the cursor is after end so you have to remember to arrow up before typing the method body. Same with do ... end blocks.

This behavior IMO is unexpected because in other cases where VSCode autocompletes, the cursor is placed where you would expect. E.g. if you type " or ( you get "" or () but the cursor is between the two characters and you can immediately continue typing.

I really like the completion feature in concept, but since the cursor is placed in the wrong spot it slows me down to the point where disabling completion and typing the whole block myself is faster. Especially since completion isn't enabled in ERB files, so working on a Rails project I have to keep track of the context to type blocks successfully.

@thedanbob thedanbob added bug Something isn't working vscode This pull request should be included in the VS Code extension's release notes labels Dec 11, 2024
@Thomascountz
Copy link

I've experienced this as well. Here are the RPC messages. (Cursor position is denoted by )

DATA.readlines do | 

Results in:

DATA.readlines do || 
// Send:
{
  "jsonrpc": "2.0",
  "method": "textDocument/didChange",
  "params": {
    "textDocument": {
      "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb",
      "version": 179
    },
    "contentChanges": [
      {
        "range": {
          "start": {
            "line": 5,
            "character": 18
          },
          "end": {
            "line": 5,
            "character": 18
          }
        },
        "text": "|"
      }
    ]
  }
}
// Send:
{
  "jsonrpc": "2.0",
  "id": 465,
  "method": "textDocument/onTypeFormatting",
  "params": {
    "textDocument": {
      "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb"
    },
    "position": {
      "line": 5,
      "character": 19
    },
    "ch": "|",
    "options": {
      "tabSize": 2,
      "insertSpaces": true,
      "trimTrailingWhitespace": true,
      "insertFinalNewline": true,
      "trimFinalNewlines": true
    }
  }
}
// Receive:
{
  "id": 465,
  "result": [
    {
      "range": {
        "start": {
          "line": 5,
          "character": 19
        },
        "end": {
          "line": 5,
          "character": 19
        }
      },
      "newText": "|"
    }
  ],
  "jsonrpc": "2.0"
}
// Send:
{
  "jsonrpc": "2.0",
  "method": "textDocument/didChange",
  "params": {
    "textDocument": {
      "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb",
      "version": 180
    },
    "contentChanges": [
      {
        "range": {
          "start": {
            "line": 5,
            "character": 19
          },
          "end": {
            "line": 5,
            "character": 19
          }
        },
        "text": "|"
      }
    ]
  }
}
// Send:
{
  "jsonrpc": "2.0",
  "id": 466,
  "method": "textDocument/documentHighlight",
  "params": {
    "textDocument": {
      "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb"
    },
    "position": {
      "line": 5,
      "character": 20
    }
  }
}
// Receive:
{
  "id": 466,
  "result": [],
  "jsonrpc": "2.0"
}
// Send:
{
  "jsonrpc": "2.0",
  "id": 467,
  "method": "textDocument/codeAction",
  "params": {
    "textDocument": {
      "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb"
    },
    "range": {
      "start": {
        "line": 5,
        "character": 20
      },
      "end": {
        "line": 5,
        "character": 20
      }
    },
    "context": {
      "diagnostics": [],
      "only": [
        "",
        "quickfix",
        "refactor",
        "refactor.extract",
        "source"
      ]
    }
  }
}
// Receive:
{
  "id": 467,
  "result": [],
  "jsonrpc": "2.0"
}
// Send:
{
  "jsonrpc": "2.0",
  "method": "workspace/didChangeWatchedFiles",
  "params": {
    "changes": [
      {
        "uri": "file:///Users/thomascountz/Code/pipe-character-test.rb",
        "type": 2
      }
    ]
  }
}

@vinistock vinistock removed the vscode This pull request should be included in the VS Code extension's release notes label Dec 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants