vim 移动光标并生成gf,但在上一个文件中移动到旧位置

izkcnapc  于 2022-11-11  发布在  其他
关注(0)|答案(1)|浏览(141)

我知道可以做到这一点的插件几乎肯定是存在的。或者也许我可以使用像LSP这样的东西。但我想使我的简单命令,这将进入文件的组件/功能/类的定义在JS。这并不困难,因为在JS所有的导入是显式的,所以我写了这个命令在我的。vimrc
autocmd FileType javascript nnoremap gd gd/from<CR>:noh<CR>5lgf
gd =转到定义(第一次出现的符号)
/from =在此字符串中查找(因为字符串将类似于“import smth from 'filename'”)
:noh =删除不必要的高亮显示
5l =从单词跳到文件名
gf = go文件
这工作得很好,它去所需的文件,但当我回到我的旧文件,我的光标显然是与导入行,但我想留在行例如(我运行gd命令),但不是在导入ComponentName从'./path/ComponentName'(例如).我听说过:keepjump,但我不明白我怎么能用它在那里.我该怎么做?

8hhllhi2

8hhllhi21#

假设您没有重命名导入

使用Vim的默认设置,例如$ vim --clean main.js,您应该能够直接在缓冲区中的任何ComponentName上使用gf,只需正确设置:help 'path'选项。
在下面的例子中,我需要做的只是:set path+=./x/y/z(非常显式),但我可以简单地做:set path+=x/**(更隐式):

当然,手动添加每个组件目录是不可能的,但前端项目往往具有可预测的结构,因此编写自己的set path+=components/**,src/**,<other directories>并不太困难。

假设您已重命名导入

你的Map不能满足它,因为它太脆弱了。相反,我们可以采取一种不同的方法:

gd                                 " jump to local definition of current word
$                                  " move cursor to end of the line
F'                                 " move cursor to nearest single quote to the left
yi'                                " yank filename
<C-o>                              " jump back to usage
:execute 'find' getreg('"')<CR>    " find filename in path

这就给出了

nnoremap <key> gd$F'yi'<C-o><Cmd>execute 'find' getreg('"')<CR>

---编辑---
根据您的意见,这里有一个不受引用限制的变体,它使用一个自定义函数来使增加的复杂性变得易于管理:

function! FindModule()
    " jump to definition of current word
    normal! gD
    " move cursor to end of line
    normal!
    " move cursor to opening quote
    normal! gEW
    " move cursor inside the quotes
    normal! l
    " grab filename
    let fn = expand('<cfile>')
    " jump back back to usage
    " ^O is obtained by pressing <C-v> then <C-o>
    normal! ^O
    " find filename in path
    execute 'find' fn
endfunction
nnoremap <key> <Cmd>call FindModule()<CR>

--结束--
您可能会对this article感兴趣。

相关问题