Intereting Posts
Команда для получения процессорных ядер в LINUX IA64 Как использовать xinput для настройки нескольких устройств со сценарием? Сортировка нескольких файлов csv на основе двух столбцов в каталоге VIM с Python – несколько # не окрашиваются как комментарий Как генерировать menu.lua для Awesome WM из меню GNOME? изменять текстовый файл только с одним номером, подлежащим ограничениям Как установить права доступа к файлам с помощью команды touch Как установить более свежие версии программного обеспечения, чем то, что предоставляет Debian? Как проверить систему Fedora, если IPv6 отключен или нет? Подавление шума в реальном времени RHEL 6.1 yum зависает на «Обновление репозиториев Red Hat». Wi-Fi – связанный, но не разрешенный Запуск 64-битной виртуальной Linux на любом чипе AMD / Intel без поддержки VT-X Как обрабатывать файл, содержащий кавычки? XFCE4: изменение рабочих областей во время перемещения окна

Сохранять измененную метку времени после редактирования

Для файлов в определенной папке я бы хотел, чтобы vim никогда не касался «измененной» метки времени вообще.

Фон заключается в том, что я использую Bloxsom для ведения блога, который использует текстовые файлы в ~/bloxsom как источник всех статей. Дата публикации (и, следовательно, порядок появления) основана на дате изменения текстового файла. Я не хочу, чтобы статья всплывала, как если бы она была новой, когда я просто исправлял опечатку. (Я много их …: D)

Пока что vim изменяет временную метку, а оригинальная печать теряется навсегда. Это нормально, и я хочу сохранить его таким образом для большинства файлов в системе. Но я не хочу этого для файлов блога – я всегда могу touch к файлу, если нужно.

Любые идеи о том, как настроить vim на такое поведение?

Я не думаю, что у vim есть эта функция. Один из вариантов – изменить копию и установить временную метку соответствующим образом, например:

 cp -p post temp vim temp touch -r post temp cp -p temp post 

Или еще лучше:

 touch -r post timestamp vim post touch -r timestamp post 

Если вам нужно повеселиться:

 file=path; mtime=$(stat -c %y "$file"); vi "$file"; touch -d "$mtime" "$file" 

Заменить путь с помощью вашего фактического пути к файлу

Я написал для этого сценарий Perl.

Это оболочка vim, сохраненная в ~/bin/vim-nomtime.pl и ~/bin/vim-nomtime.pl в эксплуатацию через alias vim='~/bin/vim-nomtime.pl' в моем .bashrc.

 #!/usr/bin/perl use strict; use warnings; use Cwd qw/ abs_path /; my @dirs = qw( ~/blosxom /srv/relief/blosxom ); s/^~/$ENV{HOME}/ foreach @dirs; # do we want to preserve stamp on this file? sub fits { my $dir = abs_path($_[0]); my $fits = 0; foreach (@dirs) { my $preserved_dir = abs_path($_); $fits++ if $dir =~ m|^$preserved_dir|; } return $fits != 0; } # store original stamps my $original_stamp; foreach (@ARGV) { if ( -f $_ and fits($_) ) { $original_stamp->{$_} = (stat($_))[9]; } } # run vim as you would my $cmd = join ' ', 'vim', @ARGV; system($cmd) == 0 or die "vim failed: $!"; # restore stamps if they have changed foreach (keys %$original_stamp) { next unless -f $_; my $current_stamp = (stat($_))[9]; unless ($current_stamp == $original_stamp->{$_}) { utime $original_stamp->{$_}, $original_stamp->{$_}, $_; } } 

Некоторые хорошие возможности:

  • поддерживает несколько имен файлов

  • поддерживает несколько «наблюдаемых» каналов

  • поддерживает символическую ссылку

  • могут быть усилены другими критериями

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

  • он восстанавливает печать только после того, как vim ушел, поэтому, если я делаю длинное редактирование и сохраняю регулярно, файл vill «всплывает» как новый, пока я не выйду из vim

  • он поддерживает несколько файлов в командной строке, но довольно наивным образом – он проверяет, является ли вещь на @ARGV файлом. Это, вероятно, не будет работать с подстановочными знаками (например, vim note-*.txt ) или другими забавными вещами

  • это не краш-доказательство, возможно, даже не HUP-proof (это можно сделать)

  • … привет, это обертка. (Я имею в виду, если мы разрешим все через обертку, сколько у нас будет оберток, прежде чем что-нибудь случится?)

Этот короткий скрипт сохранит измененное время, если любой родительский каталог файла содержит файл .nomtime :

 #!/bin/bash dir="${1%/*}" [ "$dir" = "$1" ] && dir=. dir=$( readlink -f "$dir" ) nomtime= while [ -n "$dir" ]; do if [ -f "$dir/.nomtime" ]; then nomtime=1 break fi dir="${dir%/*}" done if [ "$nomtime" = 1 ]; then T=`tempfile` touch -r "$1" $T fi vi "$1" if [ "$nomtime" = 1 ]; then touch -r $T "$1" rm $T fi