LINUX.ORG.RU

vifm обновился до версии 0.7.6

 , , ,


1

1

vifm является двухпанельным консольным файловым менеджером с Vim-подобным модальным управлением, позаимствовавшим некоторые идеи из почтового клиента mutt.

Очередная минорная версия улучшает интеграцию с внешним окружением и утилитами, а также добавляет несколько улучшений в механизм фильтрации файлов по именам. Естественно, был улучшен прежний функционал и исправлены ошибки.

Основные изменения:

  • добавлен режим интерактивной фильтрации файлов;
  • добавлена возможность редактирования командной строки во внешнем редакторе;
  • добавлена интеграция с tmux;
  • добавлены опции для задания формата вызова внешних команд для :apropos, :find, :grep и :locate;
  • добавлен desktop-файл и обновлена иконка приложения.

Другие более-менее существенные изменения:

  • добавлена возможность ручного обновления окна предпросмотра;
  • добавлен вариант слияния каталогов при разрешении конфликтов копирования/перемещения;
  • более разумная политика сохранения стека директорий;
  • различные мелкие улучшения для более удобной работы с фильтрами;
  • улучшена подсветка файла vifmrc для Vim;
  • расширена/добавлена документация по некоторым темам.

P.S. Кто-то спрашивал насчёт более точного управления за ходом операций (копирования, перемещения). Так вот, работы в данном направлении ведутся и могут в каком-то виде войти в следующий релиз.

>>> Скриншоты

>>> Ссылки для скачивания

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: cetjs2 (всего исправлений: 1)

Ответ на: комментарий от xaizek

Это требует реализации файловых операций вручную, а не внешними утилитами

может попробовать по аналогии с pv?

MyTrooName ★★★★★
()
Ответ на: комментарий от xaizek

К сожалению, ещё нет. Это требует реализации файловых операций вручную, а не внешними утилитами. Подходящих библиотек на C (не комбайнов вроде gtk или того, что есть у Apache) для этого найти не удалось. Планирую иметь первоначальную реализацию в каком-то виде в следующем релизе (по умолчанию будет включёна текущая реализация).

Есть хак с парсингом вывода strace: можно подсчитать, сколько байтов надо скопировать, а потом считать, сколько байтов было записано (strace -e write после “=” выдаёт количествой записанных байт). Правда, мой вариант (cp_p: CP with Progress bar, ниже), работает не всегда корректно.

#!/bin/zsh
set -A SOURCES
typeset -g \
    DEREFERENCE=""
typeset -gi \
    DOHARDLINKS=0 \
    DOSYMLINKS=0 \
    ONEFILESYSTEM=0
typeset -ga SOURCES
function parse_args()
{
    local -i SKIP=0
    local -i HAS_TARGETDIR=0
    local LASTSOURCE=""
    for arg in $@
    do
        if (( SKIP ))
        then
            SKIP=0
            continue
        fi
        if [[ "$arg" =~ "^-.*" ]]
        then
            case $arg in
                --no-preserve|--reply|--sparce|--target-directory|-S|--suffix|-V|--version-control)
                SKIP=1 ;;
                --*)
                    [[ "$arg" == "--link"            ]] && DOHARDLINKS=1
                    [[ "$arg" == "--dereference"     ]] && DEREFERENCE="-L"
                    [[ "$arg" == "--no-dereference"  ]] && DEREFERENCE=""
                    [[ "$arg" == "--symbolic-link"   ]] && DOSYMLINKS=1
                    [[ "$arg" == "--one-file-system" ]] && ONEFILESYSTEM=1 ;;
                -*) [[ "$arg" =~ "H"    ]] && DEREFERENCE="-D"
                    [[ "$arg" =~ "L"    ]] && DEREFERENCE="-L"
                    [[ "$arg" =~ "[Pd]" ]] && DEREFERENCE=""
                    [[ "$arg" =~ "l"    ]] && DOHARDLINKS=1
                    [[ "$arg" =~ "s"    ]] && DOSYMLINKS=1
                    [[ "$arg" =~ "x"    ]] && ONEFILESYSTEM=1 ;;
            esac
            [[ "$arg" =~ "^--target-directory" ]] &&
                HAS_TARGETDIR=1
        else
            [[ -z "$LASTSOURCE" ]] || SOURCES=( $SOURCES "$LASTSOURCE" )
            LASTSOURCE="$arg"
        fi
    done
    (( HAS_TARGETDIR )) && SOURCES=( $SOURCES $LASTSOURCE )
    typeset -gr DEREFERENCE DOHARDLINKS DOSYMLINKS ONEFILESYSTEM SOURCES
}
function main()
{
    parse_args $@
    typeset -a KEYS
    (( ONEFILESYSTEM )) && KEYS=( -x )
    [[ -z "$DEREFERENCE"   ]] || KEYS=( $KEYS $DEREFERENCE )
    if (( ! ( DOHARDLINKS || DOSYMLINKS ) ))
    then
        local PGBAR FIFO
        local -i line LENGTH WRITTEN=0 OLDLENGTH=-1 OLDPERCENT=-1 \
            BYTES=$(du --count-links --total -b $KEYS $SOURCES | tail -n 1 | \
                                                            awk "{ print \$1 }")
        # if [[ -p $HOME/.settings/cp_p-fifo ]]
        # then
            # FIFO=$HOME/.settings/cp_p-fifo
        # else
            # FIFO=$(mktmp -u)
            # mkfifo $FIFO
        # fi
        # strace -o $FIFO -q -ewrite cp $@ >/dev/null &
        # trap "kill -INT $! ; exit" INT
        # cat $FIFO | grep "^write" | grep -o "[[:digit:]]\\+\$" | \
        ( sleep 0.1s && exec cp $@ ) &
        trap "kill -INT $! ; exit" INT
        strace -q -ewrite -p$! 2>&1 | grep "^write" | \
                                      grep -o "[[:digit:]]\\+\$" | \
            while read line
            do
                (( WRITTEN+=line ))
                (( LENGTH  = ((COLUMNS-7)*WRITTEN)/BYTES ))
                (( PERCENT =         (100*WRITTEN)/BYTES ))
                (( LENGTH==OLDLENGTH && PERCENT==OLDPERCENT )) && continue
                (( OLDPERCENT=PERCENT ))
                echo -n "["
                (( LENGTH > 1 && LENGTH!=OLDLENGTH )) && PGBAR="${PGBAR}="
                (( OLDLENGTH=LENGTH ))
                echo -n ${PGBAR}
                (( LENGTH )) && echo -n ">"
                printf "%*s] %*u%%\r" $(( COLUMNS-7-LENGTH )) "" 3 \
                                      $PERCENT
            done
    else
        cp $@
    fi
}
main $@
ZyX
()
Последнее исправление: ZyX (всего исправлений: 1)

xaizek, такой вопрос: не планируется добавить базовое управление мышью? рассматриваются такие предложения? если да, могу наваять фичреквест с идеями

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Думал, но это не будет работать для директорий. Разве что пропускать их через tar дважды, но это уже слишком как по мне.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от ZyX

Спасибо за интересную идею. Это достаточно хардкорное решение мониторить системные вызовы для определения прогресса операций. Но всё равно изначально надо будет определять исходный размер для директорий, а также strace различается на разных *nix системах (хотя и не очень сильно, наверное).

Переход на системные вызовы открывает много других возможностей вроде отмены операций, перевода их в фон, значительное повышение производительности на больших объёмах файлов и другие. Так что лучше не откладывать неизбежное, хотя это конечно несёт с собой некоторый риск при файловых операциях на первых этапах, поэтому текущая реализация не будет удалена ещё долго.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

Есть в TODO уже довольно давно. Реализовывал в каком-то виде и соответствующие изменения лежат локально. Не включено в основную версию из-за того, что нормально оно не работало (клики и прокрутка отзывались очень медленно). Сейчас перенёс коммиты на текущий master и оказалось, что работает оно довольно сносно. Видимо причина была в задержке escape-последовательностей, которая была убрана уже позже попытки заставить мышь работать.

Спасибо за напоминание. Жду фирчервест с идеями. Как было сделано ранее:

  • клик ЛКМ — выбор панели, файла, символа в командной строке
  • двойной клик ЛКМ — открытие файла/каталога
  • клик ПКМ — список программ, способных запустить данный файл
  • колесо — скроллинг

P.S. Всё же какие-то проблемы с обработкой мыши есть: при активном её использовании действия начинают игнорироваться, а потом снова работают. Толи это ncurses так работает, то ли xterm у меня что-то не то отправляет, но похоже что это из-за интервала для определения двойного клика, он портит всё остальное.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

из-за интервала для определения двойного клика

предложил бы вообще двойной клик убрать. открытие файла - по ЛКМ сразу (причем в меню программ), т.к. просто выбирать файл курсором смысла не вижу - все равно все действия клавиатурой.

пкм предложил бы тегирование файла (+ выделение его курсором, вместо лкм). скроллинг - перемещение курсора вверх/вниз, особенно в меню списка программ.

а вообще, лучше всего опцию mousescroll=disabled|cursor|page и набор команд `:map <MB0> ...`

MyTrooName ★★★★★
()
Ответ на: комментарий от xaizek

вот если бы tar выравнивал начало каждого файла на 4K байт, тогда бы самое то - всё бы работало в режиме copy-on-write, и никакого оверхеда. для малого количества крупных файлов, во всяком случае. хотя, может, и без выравнивания все ок

из related фич еще бы предложил копирование/перемещение в фоне и корзину индивидуальную для каждой fs.

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

предложил бы вообще двойной клик убрать. открытие файла - по ЛКМ сразу (причем в меню программ), т.к. просто выбирать файл курсором смысла не вижу - все равно все действия клавиатурой.

Может иметь смысл посмотреть больше информации по этому файлу в статусной строке.

пкм предложил бы тегирование файла (+ выделение его курсором, вместо лкм). скроллинг - перемещение курсора вверх/вниз, особенно в меню списка программ.

Тогда можно сделать переключение на перемещения курсора по достижению краёв экрана.

mousescroll=disabled|cursor|page

Уточню, cursor — перемещать курсор и за ним всё остальное, page — перемещать верхнюю строку (т.е. выполнять обычную прокрутку, за которой уже будет следовать курсор)?

`:map <MB0> ...`

Можно сделать, но это не отменяет необходимости поведения по умолчанию (иначе не будет способа выделить файл под курсором мыши).

В целом согласен, спасибо. Но я ещё посмотрю в чём может быть проблема с мышью, даже при выключеном двойном клике прокрутка вниз заедает, при этом прокрутка вверх работает без проблем. Если не удастью решить, то смысла делать такую кривую поддержку мыши особо не будет.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Уточню

да, как вариант. только названия опций нужно повнятнее придумать

Может иметь смысл посмотреть больше информации по этому файлу в статусной строке

если по ПКМ файл тегируется и выделяется курсором, то этого достаточно

MyTrooName ★★★★★
()
Последнее исправление: MyTrooName (всего исправлений: 2)
Ответ на: комментарий от quantum-troll

Точно так как mc, который всё это имеет внутри себя, скорее всего никогда. Это конечно удобно, но не хочеться совмещать файловый менеджер и архиватор в одну программу (плюс часть обязаностей ядра, то есть VFS). А через FUSE (например: fuseiso, fuse-7z, fuse-zip, archivemount, rar2fs) и так умеет, только надо прописать их в vifmrc (примеры есть в том vifmrc, что идёт с vifm).

xaizek ★★★★★
() автор топика
Ответ на: комментарий от bohm

Кроме как собрать самому, как подсказывает MyTrooName, пока, наверное, нигде. Я б собрал, да дистрибутив не тот.

P.S. На правах рекламы, так сказать. Если кто-то хочет стать мейнтейнером пакетов в Debian, можно начать с vifm. Предыдущий мейнтейнер сделал много инфраструктурных обновлений и благодаря ему новые релизы, по идее, должно быть сравнительно нетрудно выкладывать. Он и помощь новому в этом человеку был готов предоставить.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от ZyX

Да, этот леденящий душу песец конечно лучше чем просто воспользоваться glib.

ТС, в своем отрицании существующего кода ты смешон и нелеп, а твой колхоз так им и останется.

anonymous
()

vifm очень долго открывает директории с множеством (от нескольких тысяч до десятков и сотен тысяч файлов). Я не смотрел, но полагаю, что он на каждый файл делает stat. Нельзя ли обойтись без этого, а вызывать stat где-нибудь в фоновом процессе?

anonymous
()
Ответ на: комментарий от MyTrooName

Вот он в QA Debian. Там есть почта. Дай знать, если не будет отвечать, попробую связаться через Jabber. Но думаю, он ответит.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Скорость ещё может зависеть от сортировки. stat действительно делается, но избежать этого врятли возможно. Ведь без него будет очень мало информации, что сделает сортировку по чему-то кроме имени файла невозможной. Есть вариант оптимизации для сортировки по имени, но со стороны это будет выглядеть странно.

Запрашивать информацию в фоновом потоке наверное можно, но это скорее всего вызовет подтормаживание при прокрутке.

Попробую глянуть на что тратся время для больших каталогов, может быть проблема в другом.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Первый раз о нём услышал. Лучше/хуже без контекста сравнить не выйдет. Навскидку vifm кросс-платформенный и vim-подобный. Если для Вас vim-стиль работы с программами не интересен, то и vifm ничем особо не пригодится. Основная аудитория - Vim-addicted.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от anonymous

Можно услышать названия существующих в меру компактных кросс-платформенных библиотек для выполнения стандартного набора файловых операций? Я искал, но допускаю, что мог пропустить что-то по теме.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Можно услышать названия существующих в меру компактных кросс-платформенных библиотек для выполнения стандартного набора файловых операций?

А понятно, glib, по твоему, жирный чмонстр. Ок.

anonymous
()
Ответ на: комментарий от anonymous

Тут дело не в glib и его размерах, а в том, что требовать наличие библиотеки, из которой используется всего лишь малая часть, — не лучшая идея на мой взгляд. Кстати говоря, изначально vifm был написан под GTK+ (и назывался Vide), если бы так и было по сей день, то glib была бы идеальным выбором.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

а в том, что требовать наличие библиотеки, из которой используется всего лишь малая часть, — не лучшая идея на мой взгляд.

glib используется нириальной кучей проектов. Можно считать, что она предустановлена. Уменьши энтропию, не убивай невинных котят!

// Если хочется фана, то есть libeio.

anonymous
()
Ответ на: комментарий от anonymous

glib используется нириальной кучей проектов. Можно считать, что она предустановлена.

Почти всегд да, но есть пользователи vifm которые используют его без X-сервера, в том числе в нативной Linux-консоли. Не уверен, что у них glib стоит. Но понятно, что это не определяющий фактор.

Если хочется фана, то есть libeio.

Спасибо! Не думал, что надо искать библиотеки с асинхронным вводом/выводом. Но libeio только для Linux, а вот по её следам нашёл libuv. Хоть сравнить теперь есть что.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

но есть пользователи vifm которые используют его без X-сервера, в том числе в нативной Linux-консоли. Не уверен, что у них glib стоит.

glib с иксами ничего не связывает. Они только в gdk начинаются.

anonymous
()
Ответ на: комментарий от anonymous

Да, я это знаю. Просто не могу сходу назвать хоть одно консольное приложение использующее glib. Но вероятно это я просто не знаю о таких зависимостях.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от anonymous

mc

Несколько неожиданно. Спасибо, буду знать.

xaizek ★★★★★
() автор топика

о, живой разработчик консольного файлового менеджера
как там дела со встроенным текстовым редактором ?

kto_tama ★★★★★
()
Ответ на: комментарий от kto_tama

как там дела со встроенным текстовым редактором ?

Это юмор у Вас такой? Нету встроенного редактора, только быстрый просмотр файлов и редактирование командной строки, но не тянет это вместе на редактор.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

почему юмор-то ?
я на полном серьезе
берешь какой-нибудь нано-редактор, интегрируешь в свой менеджер

я в свое время тренировался и написал собственную версию консольного файлового менеджера
там даже зачатки виртуальной файловой системы есть
получился уродливый полу-монстр
лежит у меня на сайте:
http://iakovlev.org/index.html?p=1362&m=1&l1=4

kto_tama ★★★★★
()
Последнее исправление: kto_tama (всего исправлений: 1)
Ответ на: комментарий от MyTrooName

Просто так ничего нормального из этого не получиться. Если приложение не поддерживает модальный ввод, то в итоге выйдёт сильно «кастрированый» vim-like режим.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от kto_tama

Значит это я неправильно понял. Но это на самом деле практически невыполнимая задача. Консольные приложение не расчитаны на встраивание друг в друга. Это можно сделать только эмулируя терминал. Т.е. для файлового менеджера это означало бы засунуть в него мультиплексер терминала, другого способа я не вижу. Плюс ncurses это всё просто так проделать не даст, в нём свои ограничения.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от kto_tama

О, автор http://www.iakovlev.org! Отличный сайт, спасибо за него. Много хорошего материала там находил, особенно в разделе OS.

xaizek ★★★★★
() автор топика
Ответ на: комментарий от xaizek

да, логично. тогда просто vim-like файловый менеджер с предпросмотром картинок. но это все мечты, мечты)

с другой стороны, и просто возможность сделать hjkl-управление в gwenview - это хорошо. такое, AFAIR, настраивается в qt где-то, но для всех приложений разом, для QIconView, или как его там

знаю, что такие viewer'ы и так есть, но интерфейс не очень нравится у тех, что видел

MyTrooName ★★★★★
()
Ответ на: комментарий от kto_tama

как там дела со встроенным текстовым редактором ?

а зачем встроенный?

да и кто из тех, кто использует vifm, не будет использовать vim?

MyTrooName ★★★★★
()
Ответ на: комментарий от xaizek

да, для легковесного неплох, но кое-чего не хватает. Не ходит по каталогам, не удаляет файлы, не сохраняет изменения (повороты, например).

И подтормаживает при генерации thumb'ов: пока не догенерит очередной, на управление не реагирует.

Вообще, не такая сложная задача, чтобы самому написать.

MyTrooName ★★★★★
()
Ответ на: комментарий от MyTrooName

Чего нет, того нет. И навряд ли будет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.