Vim কমান্ডগুলি ভিপ করা কি সম্ভব?


18

আমি নিম্নলিখিত শেলটি চালাতে চাই।

wea-this is the end of the second word | vim j
exit 0

যা আমি আশা করেছিলাম কী স্ট্রোকটি পাইপ করবে w(একটি শব্দ এগিয়ে নিয়ে যাবে) তারপরে e(শব্দের শেষে) তারপর a(সংযোজন) তারপরে -this is the end of the second word(পাঠ্য) নামের ভিম নথিতে jযা ইতিমধ্যে এতে শব্দ রয়েছে।

শেল স্ক্রিপ্টটি চালানোর সময় নিম্নলিখিত ত্রুটি ঘটেছে।

/root/bin/tt.sh: line 1: wea-this: command not found
Vim: Warning: Input is not from a terminal

আমি উবুন্টু 14.04 চালাচ্ছি। উত্তর দুটি ধরণের প্রশংসা করা হবে:

  1. এই পছন্দসই ফলাফলটি অর্জন করতে কীভাবে পাইপ ব্যবহার করবেন।
  2. শেল স্ক্রিপ্ট থেকে একটি পাঠ্য দস্তাবেজ সম্পাদনা করার জন্য আমি অন্য পদ্ধতিটি ব্যবহার করে "Vim কমান্ডস" (এড বা সেড কমান্ড নয়) ব্যবহার করতে পারি।

1
|চরিত্র পাইপ অন্য এক কমান্ডের আউটপুট। wea-thisকোন আদেশ নয়। পাইপিং আপনি যা করতে চাইছেন তা অর্জন করতে ব্যবহার করা যাবে না; এটি কীবোর্ড নয়, বাম হাতের অ্যাপ্লিকেশন হিসাবে ভিমের স্টিডিনকে সৃষ্টি করবে। আপনি তেজ মধ্যে একটি বাফার মধ্যে stdin করতে চান, এটা ফাইলের নাম জন্য একটি বিয়োগ দিয়ে শুরু: echo Hello, world! | vim -
ড্যাশ-টম-ব্যাং

উত্তর:


15

"hello"ফাইলের প্রথম লাইনে স্ট্রিংটি সন্নিবেশ করতে j, আপনি নিজের শেলটিতে নিম্নলিখিত কমান্ডটি টাইপ করতে পারেন:

vim +"1 | put! ='hello'" j

  • :1 কার্সারটিকে বাফারের প্রথম লাইনে নিয়ে যায়
  • :put! ='hello' স্ট্রিংটি বর্তমান লাইনের উপরে "হ্যালো" আটকান

স্ট্রিংটি সন্নিবেশ করতে "hello"এবং তারপরে ফাইলটি সংরক্ষণ এবং প্রস্থান করতে:

vim +"1 | put! ='hello' | x" j

আগের মতো একই জিনিস, আমরা সবেমাত্র প্রাক্তন কমান্ড যুক্ত করেছি :xযা সংরক্ষণ করে এবং প্রস্থান করে।

আরও সাধারণভাবে আপনি কোনও ফাইলের প্রাক্তন কমান্ডের যে কোনও ক্রম কার্যকর করতে পারেন, একটি ইন্টারেক্টিভ শেল থেকে বা ব্যাশ স্ক্রিপ্ট থেকে, এর মতো:

vim +'Ex command1 | Ex command2 | ...' file

আপনার যদি প্রচুর প্রাক্তন কমান্ড থাকে তবে আপনি সেগুলি সমস্ত একটি ডেডিকেটেড ফাইলের মধ্যে লিখতে পারেন (উদাহরণস্বরূপ বলা হয় myExCommands.vim), প্রতিটি লাইন প্রতি কমান্ড, এবং তারপরে শেল বা স্ক্রিপ্ট থেকে আপনি এটি উত্স করতে পারেন (প্রাক্তন কমান্ড :sourceবা সংক্ষিপ্ত সংস্করণ সহ) :so) এটার মত:

vim +'so myExCommands.vim' file

সম্পাদন করা

আমি দেখছি আপনি আপনার প্রশ্ন সম্পাদনা করেছেন।
আমি মনে করি পূর্ববর্তী উত্তরটি এখনও প্রযোজ্য, কারণ আপনি প্রাক্তন কমান্ডগুলি :normalএবং সহ মোড থেকে যে কোনও সাধারণ কমান্ড কার্যকর করতে পারেন :execute

উদাহরণস্বরূপ, আসুন আমরা বলতে চাই যে আপনি:

  • বাফারের প্রথম লাইনে আপনার কার্সারটি সরান ( 1G)
  • আপনার কার্সারটি লাইনের প্রথম অদ্বিতীয় স্থানের অক্ষরে স্থানান্তরিত করুন ( _)
  • আপনার কার্সরটিকে একটি শব্দ এগিয়ে নিয়ে যান ( w)
  • নতুন শব্দের শেষে আপনার কর্সারটি সরান ( e)
  • কার্সারের নিচে অক্ষরের পরে প্রবেশ মোডে যান ( a)
  • স্ট্রিং sertোকান hello
  • সংরক্ষণ এবং প্রস্থান ( :x)

ফাইলটিতে jএটি করতে শেল থেকে টাইপ করুন:

vim +"execute 'normal! 1G_weahello' | x" j

আরও তথ্যের জন্য, দেখুন:

:help +cmd
:help :normal
:help :execute

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

@ জেসনবাসানিজ আমি আমার উত্তর সম্পাদনা করেছি, প্রাক্তন কমান্ডগুলি করুন :normalএবং :executeআপনি যা চান তা করুন?
saginaw

9

Stdin থেকে ভিমের কাছে উপস্থাপিত একটি স্ট্রিম সম্পাদনা করার জন্য আপনি কেবল প্রাক্তন কমান্ডগুলির চেয়ে সাধারণ মোড কমান্ডগুলি ব্যবহার করতে পারেন। এটি খুব দরকারী উদাহরণ নয়, তবে এটি জড়িত কৌশলগুলি চিত্রিত করে। এটি ধরে নেওয়া হয় যে আপনার শেল বাশ।

echo "The brown fox jumped." | vim -s <(printf 'wcwred\e:wq! foo\n') -

-শেষে তেজ বলে পাঠ্য (না কমান্ড) stdin থেকে পড়া। The -sVim কে নির্দিষ্ট ফাইল থেকে কীস্ট্রোকগুলি চালিত করতে বলে। এই ক্ষেত্রে, ফাইলটি একটি ব্যাশ প্রক্রিয়া বিকল্পের আউটপুট। <(...)একটি নামাঙ্কিত নল নাম দ্বারা প্রতিস্থাপিত হয়। পাইপের আউটপুট হ'ল বন্ধনীগুলির মধ্যে কমান্ডের আউটপুট। wcwred\eপ্যাচসমূহ কার্সার এক শব্দ দ্বারা এবং যে পরিবর্তন পরবর্তী শব্দ থেকে red:wq! foo\nফাইলে ফলাফলের সংরক্ষণ fooএমনকি যদি যে ফাইল আগে থেকেই আছে। শেষ ফলাফল নামে একটি ফাইল fooটেক্সট ধারণকারীThe red fox jumped.

সেগুলির কয়েকটি বিষয়ে আরও জানার জন্য দেখুন

:help -file
:help -s

ম্যান পৃষ্ঠার Process Substitutionবিভাগটিও দেখুন bash(1)


যোগ করা হয়েছে আমার ~ / .zshrc: vimx () { vi -s <(echo "$1"':wq') "$2" &> /dev/null; }। এখন আমি পারি vimx 'iThe brow fox jumped.\e' foo; vimx 'wcwred\efjdwiclimbed\e' foo; cat foo। ঝরঝরে!
লিওনার্ড পাওলি

4

উপ-শেল থেকে পুনর্নির্দেশিত হিসাবে কোনও প্রোগ্রামের আউটপুট নেওয়ার পদ্ধতিটি খুব সহজ হতে আমি খুঁজে পেয়েছি:

vim <( program )

উদাহরণ:

 vim <( grep -nH  hello  myFile.cpp )
 vim <( find . -name '*.cpp' -exec grep -nH code_expr {} \+ )

4

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

অতএব, আমি এটি করার জন্য ভিমে একটি ছোট মোড়ক লিখেছি: https://github.com/MilesCranmer/vim-stream/ । এটি বলা হয় vims

মোড়কের কেন্দ্রস্থল হ'ল নিম্নলিখিত আদেশ:

vim - -nes "${vim_cmds[@]}" -c ':q!' | tail -n +2

এটি ব্যবহার করে, আমি যে কমান্ড জেনারেশন করি তা দিয়ে এটি বেশ সংক্ষিপ্ত হতে চলেছে, এবং ভিএম মডেল সম্পাদক হওয়ায় আমি vimsএকটি মডেল স্ট্রিম সম্পাদক তৈরি করেছি । পাইপলাইন-সম্পাদনা মানসিকতার সাথে উপযোগী এমন তিনটি প্রধান পদ্ধতি রয়েছে:

[-t|--turn-off-mode] - (Default mode)
                       Every string is a vim command line, e.g., '%g/foo/d' deletes
                       all lines with foo.
[-e|--exe-mode] -      Translated to '%g/$1/exe "norm $2"', see examples below
[-s|--simple-mode] -   Like exe-mode, but runs on 1st line only

এটা দেখ:

$ echo "Hello World" | vims -s "ea Beautiful"
Hello Beautiful World

সুতরাং, eএর শেষে যায় Hello, তারপরে aসংযোজন শুরু হয়।

এক্সাই-মোডে কিছু ফ্যানসিয়ার, এতে থাকা লাইনগুলিকে মন্তব্য করতে my_bad_varএবং পূর্ববর্তী লাইনটি মুছতে।

cat my_script.cpp | vims -e 'my_bad_var' 'I//\<esc>kdd'

কোনটি অনুবাদ করে vims '%g/my_bad_var/exe "norm I//\<esc>kdd"'- Iলাইনের শুরুতে সন্নিবেশ করা কমান্ড //হওয়া এবং মন্তব্য ক্রম হওয়া। \<esc>kddএস্কেপ কীটি পুশ করে, একটি লাইন উপরে নিয়ে যায়, তারপরে লাইনটি মুছে দেয়।

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


3

এটি মোটামুটি পুরানো প্রশ্ন, তবে আমি অনুভব করেছি যে এটি অবদানের জন্য উপযুক্ত যে যদি আপনার প্রদত্ত ডিস্ট্রো / ওএসের অ্যাক্সেস থাকে moreutilsতবে আপনি এটি ইনস্টল করতে পারেন এবং কেবলমাত্র এতে vipeএকটি স্ট্যান্ডার্ড সংযোজন হিসাবে ব্যবহার করতে পারেন vim:

echo foo | vipe # Now you can edit "foo" to be "bar"!

moreutilsএটির অন্যান্য সরঞ্জামগুলির জন্যও খুব কার্যকর, এবং আপনি যদি গুরুতর কমান্ড-লাইন ব্যবহারকারী হন তবে আমি তাদের সুপারিশ করব! :) আরও তথ্যের জন্য লেখকের ভূমিকা (পূর্ববর্তী লিঙ্ক) একবার দেখুন।

moreutilsপ্যাকেজ ম্যানেজারের মাধ্যমে এবং ম্যাকের হোমব্রুয়ের মাধ্যমে বেশিরভাগ * নিক্সের মতো ডিস্ট্রোসের কাছে সাধারণত পাওয়া উচিত । উদাহরণ স্বরূপ...

# Arch Linux and MSYS2 (more below) as part of the `community` repo
pacman -Sy moreutils


# Mac OS and Homebrew
brew install moreutils

moreutilsএছাড়াও MSYS2 প্যাকেজ সংগ্রহস্থলের একটি অংশ , তাই আপনি এটি প্রযুক্তিগতভাবে উইন্ডোজেও ব্যবহার করতে পারেন। :)

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