Использование одного экземпляра vim с --remote-silent
Я всегда был пользователем консоли vim, но в последнее время я пытался использовать gvim. Я сделал настройки так, чтобы мои консольные привычки не пострадали, такие как открытие терминала urxvt в текущем каталоге с помощью.
Однако иметь несколько gvim и терминалов, открытых на моем нетбуке, ужасно, быстро уменьшая мое пространство vim до сантиметра или двух. В лучшем случае ширина окна уменьшается вдвое, что делает невозможным вертикальное разделение экрана (tiling wm).
Я обошел эту проблему, используя псевдоним Vim для gvim --remote-silent
и он работал в течение нескольких дней, но сегодня мне нужно было использовать -c '' и я понял, что наличие каких-либо ключей позади --remote-silent открывает эти ключи в виде файлов. Так делаю gvim --remote-silent --foo bar
открывает два файла, --foo и bar.
Я поставил новый псевдоним для alias vim=gvim
, но я боюсь, что это снова сделает меня пользователем консоли vim, раньше, чем я думал.
Таким образом, вопрос в том, что было бы предпочтительным способом продолжать использовать gvim с минимальными усилиями (настройка системы может быть трудоемкой), чтобы я все еще мог продолжать использовать vim на полную мощность. Решение не должно использовать удаленный vim, оно должно просто минимизировать окна gvim.
2 ответа
Я опаздываю на эту вечеринку, но у меня есть предложение.
Во-первых, я согласен с @Herbert - обычно очень мало причин запускать более одного экземпляра Vim (консольного или другого). Преимущества хранения вещей в одном случае просто слишком велики. Но я вижу необходимость смешать -c
; хотя я не вижу необходимости делать это самому:D.
Лучший способ получить эту функциональность - использовать --remote-send
особенность vim вместо --remote-silent
, Это означает немного сценариев оболочки, однако:
#!/bin/bash
function resolveFile
{
if [ -f "$1" ]; then
echo $(readlink -f "$1")
else
echo "$1"
fi
}
function gg
{
local opts=$(getopt -o c: --long command: -n "gg" -- "$@")
if [ $? != 0 ]; then return 1; fi
eval set -- "$opts"
cmd=""
while :
do
case "$1" in
-c|--command)
cmd="$2"
shift 2
;;
--) shift
break
;;
esac
done
if [[ -n "$cmd" ]]; then
if [[ -n "${1-}" ]]; then
cmd=":e $(resolveFile $1)<cr>$cmd<cr>"
else
cmd="$cmd<cr>"
fi
shift 1
fi
files=""
for f in $@
do
files="$files $(resolveFile $f)"
done
cmd="$cmd:args! $files<cr>"
gvim --remote-send "$cmd"
}
Я только незначительно проверил это, но вы должны быть в состоянии сделать что-то вроде:
gg -c G file1 file2 file3 file4
Это должно редактировать file1
и перейти к нижней части этого. Затем следует также добавить file2
, file3
а также file4
в список аргументов, так что вы можете выполнять такие команды, как :bnext
, Следует также вернуться к той же функциональности, что и --remote-silent
когда вы не поставляете -c
,
Я действительно думаю, что стоит перепрыгнуть через эти обручи, чтобы правильно интегрировать ваш опыт командной строки с одним экземпляром Vim. Наличие всего в одном месте слишком сладко, чтобы сдаваться.
Я не думаю, что запуск нескольких экземпляров gvim является достойным решением. Почему бы просто не иметь один псевдоним gvim --remote-silent
что вы используете, когда вам не нужны дополнительные переключатели (предположительно, большую часть времени), а другой псевдоним просто gvim
когда вы хотите добавить параметры командной строки? Кажется, хорошо для меня, не так много, чтобы помнить.
Главная неприятность от запуска нескольких экземпляров gvim, помимо получения множества окон, которые трудно отследить, заключается в том, что каждый gvim имеет собственную среду выполнения, труднее делиться и копировать данные между буферами в разных экземплярах gvim.
У Дерека Уайетта есть интересное видео на --remote-silent; Я не думаю, что она решает вашу проблему, но вам может быть интересно посмотреть ее: OneVimToRuleThemAll
Кроме того, если проблема в том, что разделение окон в gvim отбирает свойства экрана, лучше используйте функциональность вкладок (вы даже можете отключить фактические ярлыки вкладок, но сохранить метафору открытых вкладок) и / или альтернативно просто перемещаться между буферами, имея только один буфер виден одновременно.