Command-Line

如何從我的文件管理器或命令行打開同一個 Vim 實例中的新文件?

  • September 29, 2021

我通常不從 Vim 導航我的文件系統,而是使用文件管理器,有時甚至使用好的、舊的互動式 shell(命令行)。

vim file從命令行或從基於終端的文件管理器(MC、Vifm、Ranger 等)發出完全違背了導航的目的,因為 Vim 接管了終端,阻塞了 shell 或文件管理器。當然,即使這對於 GUI 文件管理器來說也是不可能的,因為它們不在終端中執行。

一個通用的解決方案是使用xterm -e vim file & 在其自己的終端中打開每個所需的文件,但一段時間後,我最終會打開各種打開的終端,每個終端都有一個文件,並且循環瀏覽它們 Alt``Tab變得很麻煩。

有沒有辦法在同一個現有 Vim 實例的新緩衝區/選項卡中從我的導航實用程序(無論它是什麼)打開每個新文件?

首先確保vim --version | grep clientserver退貨 +clientserver。如果它返回-而不是+,啟用該功能的一種簡單方法是安裝 Gvim,即使我們不會使用它。在 Debian 和 Ubuntu 中,sudo apt install vim-athena 安裝它。對於明確想要跳過 Gvim 的有經驗的使用者,另一種選擇是從帶有 flags 的原始碼建構 Vim--with-x=yes --disable-gui

現在您已經有了+clientserver,創建包含以下vimserver內容的文件:

#!/bin/sh
serv=${S:-xtvim}
if vim --serverlist | grep -qxiF "$serv"; then
   vim --servername "$serv" --remote-tab "$@"
else
   xterm -e vim -p --servername "$serv" "$@" &
fi

不要忘記vimserver在您的目錄中放入一個目錄,$PATH 並使用chmod +x vimserver. 如果您使用其他終端,請在其手冊頁中找到在新終端視窗1中執行命令的適當標誌。

在一些文件上測試它(可以在參數中傳遞多個文件):

vimserver file1 file2
vimserver file3 file4 file5
S=xyz vimserver file6

每個文件都在名為“XTVIM”的同一個 Vim 實例的新選項卡中打開,除了file6,它轉到不同的實例“XYZ”。如果您希望新文件位於新緩衝區中,只需更改--remote-tab--remote刪除該-p標誌。

解釋vimserver

分配給serv變數的伺服器名稱預設為“xtvim”,但如上所示,可以使用環境變數指定不同的名稱S

Grep 在伺服器列表中查找確切的值serv(但不區分大小寫,因為 Vim 強制其伺服器名稱為大寫)。如果找到,則該伺服器載入該文件,否則,將啟動一個新終端並使用它的伺服器。

請求焦點

在已經存在的伺服器中打開文件時,終端不聚焦;為視窗設置實例名稱並添加 Xdotool 行可以解決:

#!/bin/sh
serv=${S:-xtvim}
if vim --serverlist | grep -qxiF "$serv"; then
   xdotool search --classname "^$serv$" windowactivate
   vim --servername "$serv" --remote-tab "$@"
else
   xterm -name "$serv" -e vim -p --servername "$serv" "$@" &
fi

由於該-name選項,Xdotool 可以定位 Vim 視窗並請求對其進行焦點。一些終端缺少該選項但具有,Xdotool自版本 3.20210804.2 起--role也可用於該選項。search

文件管理器

維夫姆

編輯~/.config/vifm/vifmrc

filextype <text/*> vimserver %f

可以通過可視模式或標記同時打開多個文件。

午夜指揮官

編輯擴展文件~/.config/mc/mc.ext

type/text
Open=vimserver %s

在 MC 中也可以標記多個文件。

GUI 文件管理器

對於他們中的許多人來說,該過程是右鍵點擊文本文件,Open with... > Custom command line / Use a custom command. 在命令文本欄位中,輸入vimserver並標記複選框(如果有)或按下將其設置為預設值的按鈕。

gvim

如果您對 Gvim 2沒問題,請不要打擾vimserver. 只需使用 gvim --remote-tab-silent.

1:Gnome-terminal、Xfce4-terminal 和 Terminator 使用-x標誌,而不是-e.

2:Goldilocks 在客戶端-伺服器模式的實際用途是什麼?.

引用自:https://unix.stackexchange.com/questions/588202