সম্পাদনার পরে পরিবর্তিত সময় স্ট্যাম্প সংরক্ষণ করুন


20

একটি নির্দিষ্ট ফোল্ডারের মধ্যে থাকা ফাইলগুলির জন্য, আমি চাইব যে আমি কখনই "সংশোধিত" টাইমস্ট্যাম্পের স্পর্শ না করি।

পটভূমি হ'ল আমি ব্লগিংয়ের জন্য ব্লকসোম ব্যবহার করি , যা ~/bloxsomসমস্ত নিবন্ধের উত্স হিসাবে সরল পাঠ্য ফাইলগুলি ব্যবহার করে । নিবন্ধের তারিখ (এবং তাই উপস্থিতির ক্রম) পাঠ্য ফাইলের পরিবর্তনের তারিখের উপর ভিত্তি করে। আমি যখনই কোনও টাইপ ঠিক করি তখন নতুন আর্টিকেলটি পপ আপ করতে চাই না । (আমি তাদের অনেকগুলি করি ...: ডি)

এখনও অবধি, ভিম টাইমস্ট্যাম্প পরিবর্তন করে এবং মূল স্ট্যাম্পটি চিরতরে হারিয়ে যায়। এটি ঠিক আছে এবং আমি এটি সিস্টেমে বেশিরভাগ ফাইলের জন্য রাখতে চাই। তবে আমি এটি ব্লগ ফাইলগুলির জন্য চাই না - touchআমার প্রয়োজন হলে আমি সর্বদা ফাইলটি করতে পারি।

এই আচরণের মধ্যে কীভাবে ভিএম টুইঙ্ক করবেন সে সম্পর্কে কোনও ধারণা?


2
vim.wikia.com/wiki/… - আপনি অবশ্যই তার পরিবর্তে পার্ল বাইন্ডিং ব্যবহার করতে পারেন
উলরিচ ড্যাঙ্গেল

উত্তর:


22

আমি মনে করি না ভিমের এই বৈশিষ্ট্যটি রয়েছে। একটি বিকল্প হ'ল একটি অনুলিপি পরিবর্তন করুন এবং যথাযথভাবে টাইমস্ট্যাম্প সেট করুন, যেমন:

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

বা আরও ভাল:

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

7

আপনার যদি কিছু মজা করা প্রয়োজন:

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

আপনার প্রকৃত ফাইল পাথ দিয়ে পাথ প্রতিস্থাপন করুন


5

আমি তার জন্য একটি পার্ল স্ক্রিপ্ট লিখেছিলাম।

এটি ভিএম এর চারপাশে একটি মোড়ক, এটি সংরক্ষণ করা হয়েছে ~/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->{$_}, $_;
    }
}

কিছু ভাল বৈশিষ্ট্য:

  • একাধিক ফাইলের নাম সমর্থন করে

  • একাধিক "দেখা" ডায়ার সমর্থন করে

  • সিমলিঙ্কড দিরকে সমর্থন করে

  • অন্যান্য মানদণ্ডের সাথে উন্নত করা যেতে পারে

যার বেশিরভাগটি সম্ভবত বিশুদ্ধ ভিএম সংস্করণ দিয়েও অর্জন করা যেতে পারে। আমার কাঙ্ক্ষিত খাঁটি-ভিএম সমাধানের তুলনায় এই সমাধানের অসুবিধাগুলি হ'ল:

  • এটি শুধুমাত্র ভিএম ছাড়ার পরে স্ট্যাম্পটি পুনরুদ্ধার করে , তাই যদি আমি দীর্ঘ সম্পাদনা করি এবং নিয়মিত সংরক্ষণ করি তবে ভিম ছাড়ার আগ পর্যন্ত ফাইলটি "পপ-আপ" নতুন হিসাবে নতুন হবে

  • এটি কমান্ড লাইনে একাধিক ফাইলকে সমর্থন করে, তবে বেশ নির্লজ্জ উপায়ে - এটি কেবল যদি পরীক্ষা করে থাকে যে কোনও জিনিস @ARGVফাইল রয়েছে কিনা। এটি সম্ভবত ওয়াইল্ডকার্ডগুলি (উদাহরণস্বরূপ vim note-*.txt) বা অন্যান্য মজার স্টাফ নিয়ে কাজ করবে না

  • এটি ক্র্যাশ প্রুফ নয়, সম্ভবত এইচওপি-প্রুফও নয় (এটি করা যেতে পারে)

  • ... ওয়েল, এটি একটি আবরণ (আমি বোঝাতে চাইছি, যদি আমরা মোড়কের মাধ্যমে সমস্ত কিছু সমাধান করি তবে কিছু খারাপ হওয়ার আগে আমাদের কতটি র‌্যাপার থাকত?)


3 ই মে, 2019, এবং আমি সবেমাত্র 11 নভেম্বর 2017 থেকে একটি ফাইল পরিবর্তন করেছি এবং এতে আমার সংশোধনও হয়েছে এবং মূল টাইমস্ট্যাম্পও সংরক্ষণ করা হয়েছে ser :)
jmort253

1

এই সংক্ষিপ্ত স্ক্রিপ্টটি পরিবর্তিত সময়টি সংরক্ষণ করবে যদি কোনও ফাইলের পিতামাতার দির একটি .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

1

এই bashফাংশনটি ব্যবহার করে দেখুন ( শিউ শকের উত্তরের ভিত্তিতে )

vi-preserve-time () {
    for file in "$@"; do
        local mtime=$(stat -c %y "$file")
        vi "$file"
        touch -d "$mtime" "$file"
    done
}

এখন আমরা ফাইলটি সম্পাদনা করতে পারি এবং এটি ব্যবহার করে পরিবর্তিত সময় সংরক্ষণ করতে পারি

vi-preserve-time file1.txt file2.txt

(1) এটি পাঁচ বছর আগের শিউ শকের উত্তরের সাথে প্রায় একই রকম । (২) এটি ধরে নেওয়া হয় যে ব্যবহারকারী viএকবারে কেবল একটি একক ফাইলে ডাকেন ; এটা কাজ করবে না vi file1 file2। (৩) এটি বলার অপেক্ষা রাখে না যে ব্যবহারকারী যদি অন্য কোনও ফাইলে স্যুইচ করেন তবে এটি :eপরিচালনা করা হবে না।
জি-ম্যান

রেফারেন্সটি ভুলে যাবেন বলে দুঃখিত, এখন আমি শ শকের উত্তরের সাথে একটি রেফারেন্স লিঙ্ক যুক্ত করেছি।
স্টিটি উইং

আপনার প্রশ্ন # 3 সম্পর্কে, আমি মনে করি আপনি যদি অন্য কোনও ফাইল খুলেন তবে কমান্ড লাইনে না থাকলে এটি আপনার সমস্যা।
স্টিটি উইং

1
আমার বক্তব্যটি হ'ল, যদি প্রশ্নটি জিজ্ঞাসা করা হয় যে "আমি কীভাবে ভিএমকে আমার পছন্দমতো আচরণ করতে পারি?", এবং আপনি এমন একটি ফাংশন সরবরাহ করেন যা দেখে মনে হয় এটি ভিম ব্যবহারকারীর মতো আচরণ করে, আপনার কোনও সীমাবদ্ধতা দলিল করার দায়িত্ব আপনার উত্তর. ঠিক আছে, সম্ভবত আমার মন্তব্যটি কিছুটা অন্যায়, অন্য যেহেতু অন্যান্য উত্তরগুলির একই সীমাবদ্ধতা রয়েছে বলে মনে হয় এবং এগুলির কোনওটিরই উল্লেখ নেই, যতদূর আমি বলতে পারি। আমি আপনার উত্তরটি পর্যালোচনা করছিলাম কারণ এটি নতুন ছিল; অন্যান্য উত্তরগুলি দেখার জন্য আমি খুব বেশি সময় ব্যয় করিনি।
জি-ম্যান

1

অন্য ফাইল থেকে টাইমস্ট্যাম্প অনুলিপি করার বিকল্প রয়েছে।

touch -m -r file_source file_target

উদাহরণ:

[oracle@es abc]$ ls -tlr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ echo "hi hi" > b
[oracle@es abc]$ ls -ltr
total 4
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
-rw-r--r--. 1 oracle oinstall   6 May 13 18:58 b
[oracle@es abc]$ touch -m -r aa.txt b
[oracle@es abc]$ ls -tlr
total 8
-rw-r--r--. 1 oracle oinstall   6 May  8 20:35 b
-rw-r--r--. 1 oracle oinstall 102 May  8 20:35 aa.txt
[oracle@es abc]$ cat b
hi hi

1

আমি এই ওয়েব পৃষ্ঠায় একটি দুর্দান্ত সমাধান পেয়েছি , যা বিদ্যমান সংশোধন সময় সংরক্ষণের সময় বর্তমান ফাইলটি সংরক্ষণ করার জন্য একটি ভিআইএম ফাংশন তৈরি করে এবং এই ফাংশনটি F4ফাংশন কীতে আবদ্ধ করে :

তবে, আমি দেখতে পেয়েছি যে মূল ফাংশনটিতে একটি ছোট্ট বাগ রয়েছে, F4একই ফাইলটিতে দু'বার ব্যবহার করা হলে নিম্নলিখিত সতর্কতাটি ট্রিগার করে , কারণ পরিবর্তনের সময় পরিবর্তন হলে ভিম বিভ্রান্ত হয়:

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

ভাগ্যক্রমে, এটি ঠিক করা সহজ: আমি টাইমস্ট্যাম্পটি পুনরুদ্ধার করার পরে ফাইলটি পুনরায় লোড করার জন্য মূল ফাংশনে একটি "সম্পাদনা" কমান্ড যুক্ত করেছি, সুতরাং ফাইলটি প্রত্যাশা করার জন্য কোন সময় পরিবর্তন করতে হবে তা ভিম জানেন।

এই বাগ ফিক্সটির সাথে সংশোধিত ভিম ফাংশনটি এখানে দেওয়া যেতে পারে যা এতে যুক্ত করা যেতে পারে ~/.vimrc:

function! WriteSmall()
    let mtime = system("date -d @`stat -c %Y ".shellescape(expand('%:p')) . "`")
    write
    call system("touch --date='".mtime."' ".shellescape(expand('%:p')))
    edit
endfunction
map <F4> :call WriteSmall()<CR>

দ্রষ্টব্য: এই ফাংশনটি এর গনুহ সংস্করণের উপর নির্ভর করে date, statএবং touch


0

উপরে বর্ণিত কয়েকটি ধারণা ব্যবহার করে, এখানে সিএসএইচের জন্য খুব দ্রুত এবং নোংরা ওয়ান-লাইনার ওরফে রয়েছে যা এই উদ্দেশ্যে "সম্পাদনা" কমান্ডটি উপলব্ধ করে:

alias edit 'touch -r \!:1 /tmp/~mtime ; vim \!:1 ; touch -r /tmp/~mtime \!:1 ; rm /tmp/~mtime'

আপনি সহজেই "ভিআইএম" এর জায়গায় $ ভিসুয়াল বা $ এডিটর পরিবেশ পরিবর্তনশীলটি ব্যবহার করতে পারেন। এইভাবে আপনি ডিফল্ট সম্পাদকগুলি পরিবর্তন করতে নিম্নলিখিত কমান্ডটি জারি করতে পারেন

setenv VISUAL nano

এখন অন্য সম্পাদককে সামঞ্জস্য করার জন্য নিজেই নিজের নামটি পুনরায় সংজ্ঞায়িত করার দরকার নেই, এটি কিছুটা আরও বহনযোগ্য করে তোলে। আপনি যদি সিএসএইচ বা টিসিএসএইচ ছাড়া অন্য কোনও শেল ব্যবহার করেন তবে অবশ্যই উপরের উদাহরণগুলি সেই অনুযায়ী মানিয়ে নেওয়া যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.