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)
Ответ на: комментарий от actics

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

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

Будт круто. Мне очень понравился проект, хотел слезтс мц, но эта фича для меня критикал

actics
()
Ответ на: комментарий от 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)
Ответ на: комментарий от MyTrooName

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

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

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

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

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

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

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

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

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

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

anonymous
()
Ответ на: комментарий от 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 ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

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

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

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

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

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

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

Что насчёт sxiv? Из всех просмотрщиков изображений, что я пробовал, он понравился больше всех.

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

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

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

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

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

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

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