如何從我的文件管理器或命令行打開同一個 Vim 實例中的新文件?
我通常不從 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
文件管理器
維夫姆
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 在客戶端-伺服器模式的實際用途是什麼?.