Emacs को स्टड से बफर को शुरू में कैसे पढ़ा जाए?


36

विम के साथ मैं आसानी से कर सकता हूं

$ 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

जवाबों:


12

सही है, स्टड से एक बफर पढ़ना असंभव है।

Emacs जानकारी पृष्ठों में स्टडिन का एकमात्र उल्लेख है इस , जो कहते हैं:

बैच मोड में, Emacs प्रदर्शित नहीं होता है   पाठ संपादित किया जा रहा है, और   मानक टर्मिनल व्यवधान वर्ण   जैसे कि C-z तथा C-c करने के लिए जारी   उनका सामान्य प्रभाव है।   कार्यों prin1, princ तथा print उत्पादन करने के लिए stdout गूंज के बजाय   क्षेत्र, जबकि message और त्रुटि   के लिए संदेश उत्पादन stderr।   ऐसे कार्य जिन्हें आमतौर पर पढ़ा जाएगा   मिनीबफ़र से उनका इनपुट लें   से stdin बजाय।

और यह read समारोह से पढ़ सकते हैं stdin, लेकिन केवल बैच मोड में।

इसलिए, आप कस्टम इस्फीट लिखकर भी इसके आस-पास काम नहीं कर सकते।


7
मेरा मतलब है कि किसी का भी अनादर नहीं है, लेकिन यह घिनौना है। यह एक बहुत ही बुनियादी संपादक सुविधा है और जीएनयू ईएमएसीएस दशकों से आसपास है। इसमें निर्माण होना चाहिए।
user787832

32

आप उपयोग कर सकते हैं प्रक्रिया प्रतिस्थापन :

$ emacs --insert <(echo 123)

यह निश्चित रूप से उत्तर है जो विम कार्यक्षमता के सबसे करीब पहुंचता है। बहुत ज्यादा बस एक उपप्रकार प्रतिस्थापन में पाइप किए गए भाग को स्थानांतरित करना।
dbmikus

@dbmikus मैं यह तय नहीं कर सकता कि मैं अपने और टॉमस ऑब्रबस्की के बीच क्या पसंद करता हूं।
Andrew Wood

टॉमस के परिणाम मुझे किसी कारण से निम्नलिखित त्रुटि के रूप में मिल रहे हैं: emacs: standard input is not a tty
dbmikus

ओह वास्तव में! मैंने मान लिया कि उसने पोस्ट करने से पहले परीक्षण किया है।
Andrew Wood

1
शायद यह महीने पर निर्भर करता है।
dbmikus

13

आप किसी फ़ाइल पर रीडायरेक्ट कर सकते हैं, फिर फ़ाइल खोलें। जैसे

echo 123 > temp; emacs temp

jweede नोट करता है कि यदि आप चाहते हैं कि अस्थायी फ़ाइल को स्वचालित रूप से हटा दिया जाए, तो आप कर सकते हैं:

echo 123 > temp; emacs temp; rm temp

यह करने के लिए Emacsy तरीका है Emacs में शेल कमांड चलाने के लिए

M-! echo 123 RET

यह आपको कमांड के परिणामों के साथ * शेल कमांड आउटपुट * नामक बफर देता है।


हाँ, मुझे पता है कि वहाँ emacsy तरीका है, लेकिन मुझे आशा है कि यह unixy तरीका इस्तेमाल किया जा सकता है। एक अस्थायी फ़ाइल बनाना बहुत अच्छा विकल्प नहीं है (मुझे बाद में इसे हटाने के लिए याद रखना होगा)।
sastanin

1
जैसे कि: echo 123 > temp; emacs temp; rm temp
jweede

2
सामान्य तौर पर, Emacs और Unix के बीच एक उच्च प्रतिबाधा है। या कम से कम Emacs और पारंपरिक यूनिक्स काम प्रवाह के बीच।
Richard Hoskins

1
@jweede यदि आप M- जोड़ना चाहते हैं! मेरे उत्तर का हिस्सा आपका, फिर मैं अपना उत्तर हटा सकता था। हमारे उत्तरों में एक बड़ा ओवरलैप है, लेकिन मुझे लगता है कि भविष्य के पाठकों के लिए मेटा-बैंग महत्वपूर्ण है।
Richard Hoskins

1
अस्थायी वर्तमान निर्देशिका में पहले से ही मौजूद हो सकता है, यह सुरक्षित नहीं है; समाधान के रूप में, मैंने एक रैपर लिखा: TMP=$(mktemp) && cat > $TMP && emacs23 $TMP ; rm $TMP। सभी का धन्यवाद!
sastanin

9

यह संभव है, देखें https://stackoverflow.com/questions/2879746/idomatic-batch-processing-of-text-in-emacs

यहाँ एक 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

यह काम:

echo 123 | emacs --insert <(cat)

लेकिन, किसी कारण के लिए, केवल ग्राफिकल-मोड एमएसीएस (ग्नोम, कोनसोल, जीएनयू एमएसीएस 23.4.1) के साथ। आदेश:

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

एक त्रुटि उत्पन्न करता है 'emacs: मानक इनपुट एक tty नहीं है'। कच्चे टेक्स्ट कंसोल में प्रयास करने पर समान त्रुटि दिखाई देती है।


echo 123 | exec emacs -nw --insert <(cat) </dev/tty कार्य करना चाहिए।
pyrocrasty

यह काम करता है; क्यों अंजाम दिया? यह भी काम करता है: emacs -nw --insert & lt; (गूंज 123) & lt; / dev / tty
RoyM

जाओ आंकड़ा: साइगविन पर Emacs (w32) पर खूबसूरती से काम करता है, जहां बहुत सारी अन्य सेटिंग्स मेरी नहीं हैं
Charles Roberto Canato

5

आईटी इस एक साधारण शेल फ़ंक्शन बनाने के लिए संभव है जो स्टड से पढ़ रहा है, वैसे काम करता है (हालांकि वास्तव में यह एक अस्थायी फाइल पर लिख रहा है, तब वह पढ़ रहा है)। यहां वह कोड है जिसका मैं उपयोग कर रहा हूं:

# 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
}

आप फ़ंक्शन का उपयोग केवल emacs के लिए एक उपनाम के रूप में करते हैं, उदा।

echo "hello world" | e -

या फ़ाइलों से सामान्य के रूप में

e hello_world.txt

की जगह emacs द्वारा emacsclient समारोह में भी काम करता है।


यह मेरे लिए अच्छा काम करता है, लेकिन _emacsfun होना चाहिए emacsclient -c -t $@, या बहुत कम से कम एक एन विकल्प पर। आदमी पृष्ठों के साथ emacsclient -t --eval "(man \"$1\")" --eval "(delete-window)" (और अब आप कर सकते हैं helm-swoop मैन ग्लोरी के लिए आपका रास्ता!
Alejandro

5

पिछले उत्तरों में से किसी में भी एक और संभावना का उल्लेख नहीं किया गया है /dev/stdin यदि आपके चुने हुए यूनिक्स संस्करण में यह है।

बस खोलने की कोशिश कर रहा है /dev/stdin सीधे काम नहीं करता है, क्योंकि Emacs कुछ जाँच करता है और फिर रिपोर्ट करता है Symbolic link that points to nonexistent file। (और यदि Emacs ने आपको फ़ाइल लोड करने की अनुमति दी होती, तो इसे फिर से सहेजने की कोशिश कर रहा होता /dev/stdin उपयोगकर्ता शायद ही कभी ऐसा करेगा।)

हालाँकि संयोजन /dev/stdin उसके साथ --insert तर्क काम करता है:

echo 123 | emacs --insert /dev/stdin

यह ध्यान दिया जाना चाहिए कि यह संस्करण केवल एक्स का उपयोग करते समय काम करता है। यदि आपको एक समाधान की आवश्यकता है जो टर्मिनल में काम करता है तो मेरा सुझाव है कि आप इसे देखें एक और जवाब


मुझे मिला emacs: standard input is not a tty संदेश यह linux और bsd पर परीक्षण कर रहा है
w17t

1
@ Chinggis6 X11 का उपयोग करते समय मेरे सुझाव के अनुसार काम करता है। अगर मैं पहले प्रकार unset DISPLAY, मुझे आपके समान त्रुटि संदेश मिलता है।
kasperd

1
@ Chinggis6 मैंने अपना उत्तर इस ओर इंगित करने के लिए अद्यतन किया कि उसे X को काम करने की आवश्यकता है और एक ऐसे उत्तर की ओर संकेत किया है जो X के बिना काम करता है।
kasperd

2

ऑफ़हैंड, कुछ इस तरह:

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

या

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

एक विकल्प है। Emacs यूनिक्स के साथ एकीकृत नहीं करता है जिस तरह से विम करता है।


1
यह आश्चर्य की बात है कि Emacs ने UNIX को बेहतर ढंग से एकीकृत नहीं किया है, अपने इतिहास को देखते हुए और यह कि UNIX के प्रमुख सिद्धांतों में से एक यह है कि "सब कुछ एक फ़ाइल है"। यह Emacs में सीधे पाइप आउटपुट के लिए सहज महसूस करता है।
SabreWolfy

5
@SabreWolfy जबकि GNU Emacs को आमतौर पर Unix पर होस्ट किया जाता है, यह Vim का "Unix प्रोग्राम" नहीं है, बल्कि एक Lisp मशीन है जो बड़े पैमाने पर प्लेटफॉर्म-स्वतंत्र टेक्स्ट एडिटर को लागू करता है। (रिचर्ड हॉकिंस का उत्तर देखें; ऐसा करने का "Emacs तरीका" Emacs में शेल कमांड को पाइप करने के लिए नहीं है, लेकिन Emacs के माध्यम से शेल कमांड को इनवोक करने के लिए है M-!, जो स्वचालित रूप से परिणामी आउटपुट को एक अस्थायी बफर में कैप्चर करता है।) पवित्र युद्ध एक तरफ, न तो संपादक दूसरे की तुलना में "बेहतर" है; वे बस बहुत ज्यादा सब कुछ पर बहुत अलग दृष्टिकोण है।
Aaron Miller

सिवाय जब तुम एक खोल में हो और कुछ करना चाहते हो curl foo.bar | vim - .. मुझे माफ कर दो। मेरा मतलब curl foo.bar | emacs इसके अलावा आप ऐसा नहीं कर सकते
dylnmc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.