vscode打开终端_在neovim中使用内置终端

在neovim中使用终端

最近逐渐将编辑过程从vscode一步步转移到了nvim上,主要还是在于一个流畅度和lsp的使用上,vscode在同时启动多个lsp的时候,会在所有lsp都返回结果之后才给出响应,这导致我这种同时使用ccls和clangd的人就十分难受,于是编辑过程逐渐开始转移到vim上,但是总是有一些理由需要再看一眼vscode,其中一个点就是终端

neovim的终端差在哪里?

我一开始认为通过新建一个窗口+窗口管理器(dwm/yabai)的方式会比vscode的弹出终端更好,可是实践告诉我弹出终端可以选择看见或者看不见才是最香的。尤其需要在项目中做一些文件移动、重命名之类的工作的时候vscode可以在终端中cp/mv完直接使用、直接在终端中用code指令在vscode中打开文件。这两点使得vscode的工作和终端配合相当紧密且流畅。

这样变成了两个需要改进的点÷

  1. 我们需要在vim中实现vscode一样的弹出终端
  2. 我们需要在vim终端中使用vim命令直接在源vim中打开文件

第一点其实有人已经做得差不多了,例如 @韦易笑写的 Vim 内置终端调教记中提到的插件。但是这个插件差一点点功能。在vscode中,如果你在shell中输入了exit,shell退出的话会直接销毁原来的terminal 窗口,这样下次打开terminal就是一个全新的terminal了。 但是nvim中退出并不会销毁buffer,下次启动的时候还需要“按任意键继续”这样的操作,比较乱节奏。

现在的这个插件已经没有这个问题了

一番搜索之后我找到reddit上的一个讨论,找到了neovim中的改进方法

reddit 上关于nvim内置终端关闭的讨论​www.reddit.com

au TermClose * call feedkeys("i")

但是这个改进方法仅仅当你把光标放在终端上,原理就是输入exit之后按一个键,这对于我这种希望后台关闭的人来说还是不够的。于是我按照原来的插件中TerminalClose的写法改了一个TerminalQuit函数出来处理这个问题,代码如下

function! TerminalQuit()
    let bid = get(t:, '__terminal_bid__', -1)
    if bid < 0
        return
    endif
    let name = bufname(bid)
    if name == ''
        return
    endif
    exec "bw! ". name
endfunc

au TermClose * call TerminalQuit()

这个代码只有在nvim上才可以使用,vim上缺少TermClose事件,暂时没有找到实现的方法,如果你找到了,请务必在评论中告诉我,这样就可以合到上面提到的插件里去了,万一有一天要用原生vim也不会有问题

第二点就是怎么从终端中打开文件了,其实插件中有实现一个drop的指令,已经可以满足需要了,但是我想更近一步,我可以自定义这个文件的打开方式,于是我开始寻找一个可行的方案,最后找到了这个脚本

gist上的一个脚本​gist.github.com

打不开的朋友可以看看我小修改的版本

#!/usr/bin/env python
"""Edit a file in the host nvim instance."""
from __future__ import print_function
import os
import sys

from neovim import attach

args = sys.argv[1:]
if not args:
    print("Usage: {} <filename> ...".format(sys.argv[0]))
    sys.exit(1)

addr = os.environ.get("NVIM_LISTEN_ADDRESS", None)
if not addr:
    os.execvp('nvim', args)

nvim = attach("socket", path=addr)


def _setup():
    nvim.input('<c-><c-n>')  # exit terminal mode
    chid = nvim.channel_id
    nvim.command('augroup EDIT')
    nvim.command('au BufEnter <buffer> call rpcnotify({0}, "n")'.format(chid))
    nvim.command('au BufEnter <buffer> startinsert'.format(chid))
    nvim.command('augroup END')

    for x in args:
        print(os.path.abspath(x))
        nvim.vars['files_to_edit'] = [os.path.abspath(f) for f in args]
        nvim.command('exe "tabnew ".remove(g:files_to_edit, 0)')

    exit()


def _exit(*args):
    nvim.vars['files_to_edit'] = None
    nvim.command('augroup EDIT')
    nvim.command('au!')
    nvim.command('augroup END')
    nvim.stop_loop()


nvim.run_loop(_exit, _exit, _setup)

修改nvim.command('exe "sp ".remove(g:files_to_edit, 0)')中的指令就可以实现了,我个人更喜欢在新的tab下打开,那就可以改成nvim.command('exe "tabnew ".remove(g:files_to_edit, 0)')十分舒服

然后就是用这个命令代替shell下的vim命令,就可以做到shell下直接用vim指令打开新文件了

if [ -n "${NVIM_LISTEN_ADDRESS+x}" ]; then
    alias vim="~/.config/nvim/send_command_to_vim.py"
    alias vi="~/.config/nvim/send_command_to_vim.py"
else
    alias vim='nvim'
    alias vi='nvim'
fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值