Попытка сделать псевдонимы, которые открывают последний измененный файл

Вы не указывали удар явно, таким образом, я беру свободу предложить Вам очень простое решение для zsh:

ls -d ~/**/*| egrep -v "/.*/.*/.*/"

Если Вы хотите включать точечные файлы также:

ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"

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

2
09.11.2014, 01:31
2 ответа

Проблема в том, что вам нужно процитировать обратные ссылки в определении псевдонима. Двойные кавычки (") не приводят к подстановке команд. Вам понадобятся одинарные кавычки ("). Используйте

alias via='vim `ls -rt | tail -1`'

Хотя на самом деле:

alias via='vim -- "$(ls -t | head -n 1)"'

То есть:

  • используйте современную форму подстановки команд ($(...)).
  • процитируем ее, чтобы отключить оператор split+glob (иначе она не сработала бы, если бы в имени файла были символы IFS или спецсимволы подстановки (она все равно не сработает, если в ней есть символы newline)).
  • Используйте --, чтобы отметить конец опции для vim (иначе это не сработало бы для имен файлов, начинающихся с - или +).
  • Используйте ls -t -t | head вместо ls -rt | tail, чтобы получить результат раньше.

Не используйте

alias via="vim `ls -rt | tail -1`"

Если вы это сделаете, подстановка команды произойдет при определении псевдонима, а не при его запуске. Попробуйте набрать псевдоним через, чтобы увидеть, что на самом деле вывод не является псевдонимом через='vim `ls -rt | tail -1`', а скорее псевдоним через='vim '.

5
27.01.2020, 21:54

В zsh (также предустановленном на OS/X) и при условии, что вы используете систему завершения (compinit и co), Ctrl+Xm становится завершающей клавишей, которая расширяется до самого нового файла.

Итак:

vi Ctrl+Xm

Заставляет вас редактировать самый новый файл (вы также получаете шанс увидеть его, прежде чем нажать Return).

vi Alt+2Ctrl+Xm

для второго по новизне файла.

vi *.cCtrl+Xm

для самого нового c файла.

vi *(.)Ctrl+Xm

для самого нового обычного файла (не каталога, не fifo/device...), и так далее.

Вы также определяете свой псевдоним как:

alias via='vim -- *(.om[1])'

Для редактирования самого нового (не скрытого) регулярного файла в текущем каталоге без проблем, связанных с разбором вывода ls.

Используя bash и предполагая реализацию GNU find и sort, вы могли бы добиться того же с помощью функции типа:

via() {
  local file
  IFS=/ read -rd '' file file < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f\0' |
    sort -rzn
  ) && vim -- "$file"
}

Которую вы могли бы параметризовать, чтобы иметь возможность указать второй, третий... ... новейший файл (при условии, что GNU Bash 4.4 или новее и GNU coreutils 8.25 или новее):

via() {
  local files
  readarray -d '' -t files < <(
    find . -maxdepth 1 -type f  ! -name '.*' -printf '%T@/%f\0' |
    sort -rzn | cut -zd / -f 2
  ) && ((${#files[@]} >= ${1-1} )) && vim -- "${files[${1-1}-1]}"
}

Чтобы использовать как:

via 3

например, для редактирования третьего новейшего файла.

1
27.01.2020, 21:54

Теги

Похожие вопросы