Fork me on GitHub
#vim
<
2024-01-04
>
Nundrum18:01:31

Is there some magic way to move a function into another namespace and patch up all the code? That is something I've rarely needed before, but as I'm bumbling through learning ClojureScript I've been doing it more.

Noah Bogart19:01:10

i use ripgrep or my lsp (coc-clojure) to find all of the references, and then i copy the function into the new namespace, and then i go one-by-one through all of the references and update them

Noah Bogart19:01:19

i like to use the quick-fix list for this, so i can say :cn to go to the next location after i've edited each invocation

sheluchin20:01:49

clojure-lsp has a move-form feature that does this https://clojure-lsp.io/features/

💡 1
dominicm10:01:31

@UPWHQK562 how can you trigger move-form? Does it work with neovim-lsp?

sheluchin17:01:52

@U09LZR36F it should work with nvim-lsp, but I recently switched my config to Fennel and haven't got around to figuring this part out yet. I think you would need to use https://neovim.io/doc/user/lsp.html#vim.lsp.buf.execute_command(). With coc.nvim and viml it was:

nnoremap <silent> crmf :call CocRequest('clojure-lsp', 'workspace/executeCommand', {'command': 'move-form', 'arguments': [Expand('%:p'), line('.') - 1, col('.') - 1, input("File: ", "", "file")]})<CR>

dominicm17:01:40

Doesn't come up as a code action like I expected, but maybe it's not sending some data it should.

sheluchin21:03:40

I made it work like this in neovim using Fennel. Had some help from other folks here:

(module lsp-aug-jp
  {autoload {eval conjure.eval
             str conjure.aniseed.string
             a conjure.aniseed.core}})

(local commands ["cycle-coll"
                 "thread-first"
                 "thread-first-all"
                 "move-to-let"
                 "unwind-thread"
                 "inline-symbol"
                 "move-coll-entry-up"
                 "move-coll-entry-down"
                 "extract-function"
                 "cycle-keyword-auto-resolve"
                 "move-form"])

(vim.api.nvim_create_user_command "CljLsp"
 (fn [info]
    (let [command (a.get info :args)
          position-params (vim.lsp.util.make_position_params)
          uri (a.get-in position-params [:textDocument :uri])
          line (a.get-in position-params [:position :line])
          character (- (a.get-in position-params [:position :character]) 0)
          input (when (or (= command "move-to-let")
                          (= command "extract-function")
                          (= command "move-form"))
                  (vim.fn.input "Enter input: "))]
      (vim.lsp.buf.execute_command
        {:command command
         :arguments [uri line character input]})))
 {:desc "Run clojure-lsp command"
  :nargs 1
  :complete (fn [arg-lead cmd-line cursor-pos]
              (vim.tbl_filter
                (fn [s] (= (a.sub s 1 (a.count arg-lead)) arg-lead))
                commands))})

(vim.keymap.set :n :ez ":CljLsp cycle-coll")
(vim.keymap.set :n :et ":CljLsp thread-first")
(vim.keymap.set :n :el ":CljLsp thread-first-all")
(vim.keymap.set :n :eu ":CljLsp unwind-thread")
(vim.keymap.set :n :ei ":CljLsp inline-symbol")
(vim.keymap.set :n :en ":CljLsp move-to-let")
(vim.keymap.set :n :T ":CljLsp move-coll-entry-up")
(vim.keymap.set :n :t ":CljLsp move-coll-entry-down")
(vim.keymap.set :n :ex ":CljLsp extract-function")
(vim.keymap.set :n :ek ":CljLsp cycle-keyword-auto-resolve")
(vim.keymap.set :n :eo ":CljLsp move-form")
Obviously this snippet isn't optimized for brevity but it should be pretty straight forward to tweak or translate to vimscript or lua.