# Filter lsp-document-symbol with prompt menu

**URL:** <https://discuss.kakoune.com/t/filter-lsp-document-symbol-with-prompt-menu/2539>\
**Category:** Recipes & Guides\
**Tags:** lsp\
**Created:** [September 8, 2024, 3:48am UTC](https://discuss.kakoune.com/t/filter-lsp-document-symbol-with-prompt-menu/2539 "2024-09-08T03:48:43Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![vbauerster](https://discuss.kakoune.com/letter_avatar_proxy/v4/letter/v/85e7bf/32.png) [@vbauerster](https://discuss.kakoune.com/u/vbauerster)\
**Post date:** [September 8, 2024, 3:48am UTC](https://discuss.kakoune.com/t/filter-lsp-document-symbol-with-prompt-menu/2539/1 "2024-09-08T03:48:43Z")

</div>

There is `lsp-document-symbol` command available as part of [kakoune-lsp](https://github.com/kakoune-lsp/kakoune-lsp) plugin. It lists a structure of code in `*goto*` buffer. Sometimes I need to find specific type but the list can be quite long. So I came up with a quick prompt menu which lists unique entries available in the list.

```auto
declare-option -hidden str-list lsp_document_symbols

define-command -hidden lsp-document-symbols-prompt %{
  evaluate-commands -draft %{
    execute-keys <percent>s^<percent>:<ret>glh<a-i>b
    evaluate-commands -itersel %{
      set-option -add buffer lsp_document_symbols %val{selection}
    }
  }
  prompt -menu -shell-script-candidates %{
    echo $kak_opt_lsp_document_symbols | tr ' ' \\n | runiq
  } -on-abort %{
    set-option buffer lsp_document_symbols
  } keep-entry: %{
    execute-keys "<percent><a-s><a-K>%val{text}<ret><a-d>gg"
    set-option buffer lsp_document_symbols
  }
}

hook global BufSetOption filetype=lsp-document-symbol %{
  map buffer normal <F4> ':lsp-document-symbols-prompt<ret>'
}

```

**Note:** To make entries unique I opt in [runiq](https://github.com/whitfin/runiq). You can try plain old `uniq` but there was some dupes when I tried it.

Prompt with unique menu entries on `F4` :

 ![Screenshot from 2024-09-08 08-35-28](https://discuss.kakoune.com/uploads/default/original/2X/6/602b6ac23df54c65f48a203f338c7e57c4a5c9ba.png)

---

<div class="post-metadata">

**Author:** ![vbauerster](https://discuss.kakoune.com/letter_avatar_proxy/v4/letter/v/85e7bf/32.png) [@vbauerster](https://discuss.kakoune.com/u/vbauerster)\
**Post date:** [September 8, 2024, 4:31pm UTC](https://discuss.kakoune.com/t/filter-lsp-document-symbol-with-prompt-menu/2539/2 "2024-09-08T16:31:43Z")

</div>

**Edit:** make list unique by invoking `set-option -remove` first, thus no need for external `r?uniq`.

```auto
define-command -hidden lsp-document-symbols-prompt %{
  evaluate-commands -draft %{
    execute-keys <percent>s^<percent>:<ret>glh<a-i>b
    evaluate-commands -itersel %{
      set-option -remove buffer lsp_document_symbols %val{selection}
      set-option -add buffer lsp_document_symbols %val{selection}
    }
  }
  prompt -menu -shell-script-candidates %{
    printf %s\\n $kak_opt_lsp_document_symbols
  } keep-entry: %{
    execute-keys "<percent><a-s><a-K>%val{text}<ret><a-d>gg"
    set-option buffer lsp_document_symbols
  }
}

```

---

<div class="post-metadata">

**Author:** ![krobelus](https://discuss.kakoune.com/user_avatar/discuss.kakoune.com/krobelus/32/616_2.png) [@krobelus](https://discuss.kakoune.com/u/krobelus)\
**Post date:** [September 8, 2024, 7:38pm UTC](https://discuss.kakoune.com/t/filter-lsp-document-symbol-with-prompt-menu/2539/3 "2024-09-08T19:38:26Z")

</div>

Nice. Note there is also `lsp-goto-document-symbol` which shows a menu though I barely ever use that. But I think scratch buffers are better than menus due to their flexibility.
