microsoft / inshellisense

IDE style command line auto complete
MIT License
8.21k stars 179 forks source link

Initialization fails in NuShell #244

Closed arpadbarta closed 2 months ago

arpadbarta commented 2 months ago

Describe the bug inshellisense fails to initialize in NuShell.

To Reproduce Steps to reproduce the behavior:

  1. Install latest NuShell (I did it via winget however it should not matter)
  2. Install inshellisense (winget)
  3. Add "is init nu" to $nu.env-path as described in readme
  4. Start new instance of NuShell
  5. Fails with the following message after which it simply does not work:
    # ---------------- inshellisense shell plugin ----------------
    if "ISTERM" not-in $env and $nu.is-interactive {
    if $nu.is-login { is -s nu --login ; exit } else { is -s nu ; exit }
    }
  6. Check status with is -c results in inshellisense session [not found]

Expected behavior inshellisense should work as described, as in other shells

Environment

Additional context Add any other context about the problem here.

cpendery commented 2 months ago

@arpadbarta, what do you mean by "it fails with". Can you give more details here?

arpadbarta commented 2 months ago

Have added some additional details above, but in short it seems that it fails to start the session, after which as expected there is no running session.

What is really odd, is that if I try to start it manually with is command it switches to CMD prompt, exiting it returns to nu-shell.

cpendery commented 2 months ago

A few more follow up questions.

arpadbarta commented 2 months ago
  1. Windows Terminal 1.19.10821.0
  2. Yes:
    • is switches to CMD exiting it will go back to NuShell
    • is -s nu executes, gives the same message as above, even so it shows that I have a session somehow no suggestions are shown.

image

  1. Yes
  2. Yes, after which I have my standard nu prompt. inshellisense.log
cpendery commented 2 months ago

@arpadbarta can I see your env.nu file? I can't replicate your issue. Can you also uninstall inshellisense from winget and try using the npm installation, that's the only installation method I support

arpadbarta commented 2 months ago

Have had a better look, I installed it via npm and not winget, sorry for the confusion.

I use what ever it generated when I installed it.

# Nushell Environment Config File
#
# version = "0.91.0"

def create_left_prompt [] {
    let dir = match (do --ignore-shell-errors { $env.PWD | path relative-to $nu.home-path }) {
        null => $env.PWD
        '' => '~'
        $relative_pwd => ([~ $relative_pwd] | path join)
    }

    let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
    let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
    let path_segment = $"($path_color)($dir)"

    $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
}

def create_right_prompt [] {
    # create a right prompt in magenta with green separators and am/pm underlined
    let time_segment = ([
        (ansi reset)
        (ansi magenta)
        (date now | format date '%x %X') # try to respect user's locale
    ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
        str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")

    let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
        (ansi rb)
        ($env.LAST_EXIT_CODE)
    ] | str join)
    } else { "" }

    ([$last_exit_code, (char space), $time_segment] | str join)
}

# Use nushell functions to define your right and left prompt
$env.PROMPT_COMMAND = {|| create_left_prompt }
# FIXME: This default is not implemented in rust code as of 2023-09-08.
$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }

# The prompt indicators are environmental variables that represent
# the state of the prompt
$env.PROMPT_INDICATOR = {|| "> " }
$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }

# Specifies how environment variables are:
# - converted from a string to a value on Nushell startup (from_string)
# - converted from a value back to a string when running external commands (to_string)
# Note: The conversions happen *after* config.nu is loaded
$env.ENV_CONVERSIONS = {
    "PATH": {
        from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
        to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
    }
    "Path": {
        from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
        to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
    }
}

# Directories to search for scripts when calling source or use
# The default for this is $nu.default-config-dir/scripts
$env.NU_LIB_DIRS = [
    ($nu.default-config-dir | path join 'scripts') # add <nushell-config-dir>/scripts
]

# Directories to search for plugin binaries when calling register
# The default for this is $nu.default-config-dir/plugins
$env.NU_PLUGIN_DIRS = [
    ($nu.default-config-dir | path join 'plugins') # add <nushell-config-dir>/plugins
]
cpendery commented 2 months ago

Have had a better look, I installed it via npm and not winget, sorry for the confusion.

I use what ever it generated when I installed it.

# Nushell Environment Config File
#
# version = "0.91.0"

def create_left_prompt [] {
    let dir = match (do --ignore-shell-errors { $env.PWD | path relative-to $nu.home-path }) {
        null => $env.PWD
        '' => '~'
        $relative_pwd => ([~ $relative_pwd] | path join)
    }

    let path_color = (if (is-admin) { ansi red_bold } else { ansi green_bold })
    let separator_color = (if (is-admin) { ansi light_red_bold } else { ansi light_green_bold })
    let path_segment = $"($path_color)($dir)"

    $path_segment | str replace --all (char path_sep) $"($separator_color)(char path_sep)($path_color)"
}

def create_right_prompt [] {
    # create a right prompt in magenta with green separators and am/pm underlined
    let time_segment = ([
        (ansi reset)
        (ansi magenta)
        (date now | format date '%x %X') # try to respect user's locale
    ] | str join | str replace --regex --all "([/:])" $"(ansi green)${1}(ansi magenta)" |
        str replace --regex --all "([AP]M)" $"(ansi magenta_underline)${1}")

    let last_exit_code = if ($env.LAST_EXIT_CODE != 0) {([
        (ansi rb)
        ($env.LAST_EXIT_CODE)
    ] | str join)
    } else { "" }

    ([$last_exit_code, (char space), $time_segment] | str join)
}

# Use nushell functions to define your right and left prompt
$env.PROMPT_COMMAND = {|| create_left_prompt }
# FIXME: This default is not implemented in rust code as of 2023-09-08.
$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt }

# The prompt indicators are environmental variables that represent
# the state of the prompt
$env.PROMPT_INDICATOR = {|| "> " }
$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " }
$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " }
$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " }

# Specifies how environment variables are:
# - converted from a string to a value on Nushell startup (from_string)
# - converted from a value back to a string when running external commands (to_string)
# Note: The conversions happen *after* config.nu is loaded
$env.ENV_CONVERSIONS = {
    "PATH": {
        from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
        to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
    }
    "Path": {
        from_string: { |s| $s | split row (char esep) | path expand --no-symlink }
        to_string: { |v| $v | path expand --no-symlink | str join (char esep) }
    }
}

# Directories to search for scripts when calling source or use
# The default for this is $nu.default-config-dir/scripts
$env.NU_LIB_DIRS = [
    ($nu.default-config-dir | path join 'scripts') # add <nushell-config-dir>/scripts
]

# Directories to search for plugin binaries when calling register
# The default for this is $nu.default-config-dir/plugins
$env.NU_PLUGIN_DIRS = [
    ($nu.default-config-dir | path join 'plugins') # add <nushell-config-dir>/plugins
]

I don't see the shell plugin at the bottom of the file

cpendery commented 2 months ago

It should end with the shell plugin if you've properly echoed it to the file, try using rg to find the file with the plugin, since you didn't echo it properly to the file you sent above. This should work once the plugin has been added.

# ---------------- inshellisense shell plugin ----------------
if "ISTERM" not-in $env and $nu.is-interactive {
    if $nu.is-login { is -s nu --login ; exit } else { is -s nu ; exit }
}

Closing as this isn't an issue with the tool, but your setup