কিভাবে শুরু থেকে স্ট্যামিন থেকে ইমাস পঠিত বাফার তৈরি করবেন?


40

ভিম দিয়ে আমি সহজেই করতে পারি

$ echo 123 | vim -

ইমাক্স দিয়ে কি সম্ভব?

$ echo 123 | emacs23
... Emacs starts with a Welcome message

$ echo 123 | emacs23 -
... Emacs starts with an empty *scratch* buffer and “Unknown option”

$ echo 123 | emacs23 --insert -
... “No such file or directory”, empty *scratch* buffer

ইউনিক্স পাইপ থেকে বাফার পড়া কি সত্যিই অসম্ভব?

সম্পাদনা : সমাধান হিসাবে, আমি একটি শেল র‌্যাপার লিখেছি emacspipe:

#!/bin/sh
TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP

উত্তর:


15

সঠিক, স্টিডিনের কাছ থেকে কোনও বাফার পড়া অসম্ভব।

এ গিয়ে Emacs তথ্য পাতায় stdin একমাত্র উল্লেখ নেই এই , যা বলে:

ব্যাচ মোডে, ইমাক্স সম্পাদিত হওয়া পাঠ্যটি প্রদর্শন করে না এবং মানক টার্মিনাল বাধাগ্রস্ত অক্ষর যেমন C-zএবং C-cতাদের স্বাভাবিক প্রভাব অবিরত থাকে। ফাংশন prin1, princএবং print আউটপুট stdoutপরিবর্তে প্রতিধ্বনি এলাকা, যখন messageএবং ত্রুটিসূচক বার্তাগুলি আউটপুট stderr। ফাংশনগুলি যা সাধারণত মিনিফুফার থেকে পড়তে হয় তার stdinপরিবর্তে তাদের ইনপুট নেয় ।

এবং readফাংশনটি পড়তে পারে stdinতবে কেবল ব্যাচ মোডে।

সুতরাং, আপনি এমনকি কাস্টম এলিস্প লিখে এপাশে কাজ করতে পারবেন না।


10
আমি বলতে চাইছি কারও প্রতি অসম্মান নয়, তবে এটি ঘৃণ্য। এটি একটি খুব প্রাথমিক সম্পাদক বৈশিষ্ট্য এবং জিএনইউ ইএমএসিএস কয়েক দশক ধরে রয়েছে। এটা তোলে সালে নির্মিত হবে।
user787832

35

আপনি প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন :

$ emacs --insert <(echo 123)

এটি অবশ্যই উত্তরটি যা ভিমের কার্যকারিতার নিকটবর্তী হয়। খুব সবেমাত্র পাইপযুক্ত অংশটিকে একটি সাব-প্রসেস বিকল্পে সরানো।
dbmikus

@dbmikus আমি আমার এবং টমাসজ ওব্রেবস্কির মধ্যে কোনটি পছন্দ করি তা আমি ঠিক করতে পারি না ..
অ্যান্ড্রু উড

টমাসজের ফলাফলগুলি আমাকে কোনও কারণে নিম্নলিখিত ত্রুটি emacs: standard input is not a tty
পেয়েছে

ওহ সত্যি! আমি ধরে নিয়েছিলাম যে তিনি পোস্ট করার আগে পরীক্ষা করতেন।
অ্যান্ড্রু উড

1
হতে পারে এটি মাসের উপর নির্ভর করে।
dbmikus

14

আপনি কোনও ফাইলে পুনর্নির্দেশ করতে পারেন, তারপরে ফাইলটি খুলুন। যেমন

echo 123 > temp; emacs temp

জেভিড নোট করে যে আপনি যদি টেম্প ফাইলটি স্বয়ংক্রিয়ভাবে সরানো চান তবে আপনি এটি করতে পারেন:

echo 123 > temp; emacs temp; rm temp

Emacsy এর উপায় Emacs এ শেল কমান্ড চালানো

M-! echo 123 RET

এটি আপনাকে কমান্ডের ফলাফল সহ * শেল কমান্ড আউটপুট * নামের একটি বাফার দেয়।


হ্যাঁ, আমি জানি ইমাসি উপায় আছে তবে আমি আশা করি এটি অনন্য পদ্ধতিতে ব্যবহৃত হতে পারে। একটি অস্থায়ী ফাইল তৈরি করা খুব সুন্দর বিকল্প নয় (আমাকে এটি পরে মুছতে হবে)।
সস্তানিন

1
যেমন:echo 123 > temp; emacs temp; rm temp
জাভেদে

2
সাধারণভাবে, ইম্যাকস এবং ইউনিক্সের মধ্যে একটি উচ্চ প্রতিবন্ধকতা রয়েছে। অথবা কমপক্ষে ইমাস এবং traditionalতিহ্যবাহী ইউনিক্স কাজের প্রবাহের মধ্যে।
রিচার্ড হোসকিনস

2
@ জাভেদ আপনি এম- যুক্ত করতে চাইলে! আপনার উত্তর আমার অংশ, তারপর আমি আমার উত্তর মুছতে পারে। আমাদের উত্তরগুলিতে একটি বিশাল ওভারল্যাপ রয়েছে তবে আমি মনে করি ভবিষ্যতের পাঠকদের কাছে মেটা-ব্যাং গুরুত্বপূর্ণ।
রিচার্ড হোসকিনস

1
টেম্পের বর্তমান ডিরেক্টরিতে ইতিমধ্যে উপস্থিত থাকতে পারে, এটি নিরাপদ নয়; একটি সমাধান হিসেবে, আমি একটি মোড়কের লিখেছিলেন: TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP। সবাইকে ধন্যবাদ!
সস্তানিন

9

এটি সম্ভব, https://stackoverflow.com/questions/2879746/idomatic-batch-processing-of-text-in-emacs দেখুন

এখানে একটি ইমাস স্ক্রিপ্টে প্রতিধ্বনি রয়েছে (উপরের লিঙ্কটি থেকে অনুলিপি করা হয়েছে):

#!/usr/bin/emacs --script
(condition-case nil
    (let (line)
      (while (setq line (read-from-minibuffer ""))
        (princ line)
        (princ "\n")))
  (error nil))

বা এটি একটি বাফারে পড়ুন এবং তারপরে একসাথে সমস্ত মুদ্রণ করুন

#!/usr/bin/emacs --script
(with-temp-buffer
  (progn
    (condition-case nil
    (let (line)
      (while (setq line (read-from-minibuffer ""))
        (insert line)
        (insert "\n")))
      (error nil))
    (princ (buffer-string))
    ))

6

এটি একটি সাধারণ শেল ফাংশন তৈরি করা সম্ভব যা এটি স্টিডিনের পড়ার সাথে সাথে কাজ করে (যদিও বাস্তবে এটি একটি অস্থায়ী ফাইলে লেখা হয় তবে এটি পড়ে)। আমি যে কোডটি ব্যবহার করছি তা এখানে:

# The emacs or emacsclient command to use
function _emacsfun
{
    # Replace with `emacs` to not run as server/client
    emacsclient -c -n $@
}

# An emacs 'alias' with the ability to read from stdin
function e
{
    # If the argument is - then write stdin to a tempfile and open the
    # tempfile.
    if [[ $# -ge 1 ]] && [[ "$1" == - ]]; then
        tempfile="$(mktemp emacs-stdin-$USER.XXXXXXX --tmpdir)"
        cat - > "$tempfile"
        _emacsfun --eval "(find-file \"$tempfile\")" \
            --eval '(set-visited-file-name nil)' \
            --eval '(rename-buffer "*stdin*" t))'
    else
        _emacsfun "$@"
    fi
}

আপনি কেবল ইম্যাক্সের জন্য একটি উপকরণ হিসাবে ফাংশনটি ব্যবহার করেন, যেমন

echo "hello world" | e -

বা ফাইল থেকে স্বাভাবিক হিসাবে

e hello_world.txt

ফাংশন emacsদ্বারা প্রতিস্থাপন emacsclientপাশাপাশি কাজ করে।


এটি আমার পক্ষে ভাল কাজ করে তবে _emacsfun হওয়া উচিত emacsclient -c -t $@, বা খুব কমপক্ষে -n বিকল্পটি ড্রপ করুন। ম্যান পেজগুলি emacsclient -t --eval "(man \"$1\")" --eval "(delete-window)" (এবং এখন আপনি helm-swoopম্যান গ্লোরিতে যেতে পারেন !)
আলেজান্দ্রো

1
এটি ইমেলস্ক্লিনেন্টের সাথে কাজ করতে পারার একমাত্র উত্তর। আমি বেসিক ধারণাটির বাইরে একটি শেল স্ক্রিপ্ট তৈরি করেছি যাতে আমি এটি আই 3 কনফিগার থেকে কল করতে পারি। +1
এরগোসিস

6

এইটা কাজ করে:

echo 123 | emacs --insert <(cat)

তবে, কোনও কারণে, কেবল গ্রাফিকাল-মোড ইম্যাক্স (জিনোম, কনসোল, জিএনইউ ইম্যাক্স 23.4.1)। আদেশ:

echo 123 | emacs -nw --insert <(cat)

একটি ত্রুটি উত্পন্ন করে 'ইমাক্স: স্ট্যান্ডার্ড ইনপুটটি টিটিআই নয়'। কাঁচা পাঠ্য কনসোলে চেষ্টা করার সময় একই ত্রুটি উপস্থিত হয়।


echo 123 | exec emacs -nw --insert <(cat) </dev/ttyকাজ করা উচিত.
পাইরেলি

ওই কাজগুলো; এক্সিকিউট কেন? এটিও কাজ করে: emacs -nw --insert <(প্রতিধ্বনি 123) </ dev / tty
রায়এম


5

পূর্ববর্তী উত্তরের কোনওটিতে উল্লিখিত না হওয়া আরেকটি সম্ভাবনা হ'ল /dev/stdinআপনার নির্বাচিত ইউনিক্স ভেরিয়েন্টটি থাকলে তা ব্যবহার করা।

খালি /dev/stdinসরাসরি খোলার চেষ্টা করা কার্যকর হয় না, কারণ ইমাস কয়েকটি পরীক্ষা করে তারপরে রিপোর্ট করে Symbolic link that points to nonexistent file। (এবং যদি ইমাকস আপনাকে ফাইলটি লোড করার অনুমতি দিত, তবে /dev/stdinব্যবহারকারীর প্রত্যাশা মতোই এটি পুনরায় সংরক্ষণের চেষ্টা করে trying )

তবে যুক্তির /dev/stdinসাথে একত্রিত --insertহওয়া কাজ করে:

echo 123 | emacs --insert /dev/stdin

এটি লক্ষ করা উচিত যে এক্সটি ব্যবহার করার সময় এই সংস্করণটি কেবলমাত্র কাজ করে you আপনার যদি কোনও সমাধানের প্রয়োজন হয় যা টার্মিনালে কাজ করে তবে আমি আপনাকে অন্য উত্তরটি দেখার পরামর্শ দিই ।


আমি emacs: standard input is not a ttyএটি লিনাক্স এবং

1
@ চিংগিস 6 দেখে মনে হচ্ছে আমার পরামর্শটি কেবল এক্স 11 ব্যবহার করার সময় কার্যকর হয়। আমি যদি প্রথম টাইপ করি তবে আমি আপনার মতো unset DISPLAYএকই ত্রুটি বার্তাটি পাই।
ক্যাস্পারড

1
@ চিংগিস 6 আমি আমার উত্তরটি আপডেট করে জানিয়েছিলাম যে এটির জন্য এক্স প্রয়োজন এবং এটি একটি উত্তরকে নির্দেশ করে যা এক্স ছাড়াই কাজ করে
ক্যাস্পারড

2

অফহ্যান্ড, এমন কিছু:

$ echo 123 > tmp.txt; emacs tmp.txt

অথবা

$ echo 123 > tmp.txt; emacs tmp.txt; rm tmp.txt

একটি বিকল্প। ইম্যাকস কেবল উইনিকের সাথে ইউনিক্সের সাথে একীকরণ করে না।


1
এটি আশ্চর্যজনক যে ইমাকস ইউএনআইএক্সের সাথে আরও ভালভাবে সংহত করে না, এর ইতিহাস এবং ইউএনআইএক্সের অন্যতম মূল বিষয় হ'ল "সবকিছুই একটি ফাইল"। এটি পাইপ আউটপুটকে সরাসরি ইম্যাক্সের মধ্যে স্বজ্ঞাত বোধ করে।
SabreWolfy

5
@ সাবেরওয়ল্ফি যখন জিএনইউ ইমাক্স ইউনিক্সে সর্বাধিক হোস্ট করা হয় তবে এটি ভিমের মতো "ইউনিক্স প্রোগ্রাম" নয়, বরং একটি লিস্প মেশিন যা একটি প্ল্যাটফর্ম-স্বতন্ত্র পাঠ্য সম্পাদককে প্রয়োগ করে। (রিচার্ড হোসকিন্সের উত্তর দেখুন; এটি করার "ইম্যাক্স ওয়ে" শেল কমান্ডটি ইম্যাক্সে পাইপ করা নয়, তবে ইমাক্সের মধ্যে দিয়ে শেল কমান্ডটি আহ্বান করা উচিত M-!যা ফলস্বরূপ ফলাফলকে একটি অস্থায়ী বাফারে রূপান্তরিত করে।) পবিত্র যুদ্ধ একদিকে, কোনও সম্পাদকই অপরটির চেয়ে "ভাল" নয়; তাদের বেশ কিছু বিষয়ে খুব আলাদা দৃষ্টিভঙ্গি রয়েছে।
অ্যারন মিলার

আপনি যখন শেল হয়ে থাকবেন এবং এমন কিছু করতে চাইবেন তখন ছাড়া curl foo.bar | vim -.. আমি দুঃখিত। আমি বোঝাতে চেয়েছি curl foo.bar | emacsআপনি এটি করতে পারবেন না
dylnmc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.