سؤال

في محطة جنوم، يقوم Bash بالإكمال التلقائي الذكي.على سبيل المثال

apt-get in<TAB>

يصبح

apt-get install

في وضع shell الخاص بـ Emacs، لا يعمل هذا الإكمال التلقائي، حتى بعد أن أقوم بتحديد المصدر بشكل صريح /etc/bash_completion.المثال أعلاه العصي كما in أو الإكمال التلقائي باستخدام اسم ملف في الدليل الحالي بدلاً من اسم صالح apt-get خيار الأمر.من المفترض أن يكون هذا بسبب قيام Emacs باعتراض الضغط على مفتاح Tab.كيف أقوم بتمكين الإكمال التلقائي الذكي في shell-mode?

هل كانت مفيدة؟

المحلول

وأعرف أن هذا السؤال هو من العمر ثلاث سنوات، ولكن هذا شيء لقد كنت مهتمة ايضا في حل. بحث الويب جهني إلى قطعة من elisp أن يجعل إيماكس استخدام باش الانتهاء منه في وضع قذيفة. بالنسبة لي كان يعمل، في أي حال.

والتحقق من ذلك في https://github.com/szermatt/emacs-bash-completion .

نصائح أخرى

في قذيفة على ايماكس، انها فعلا إيماكس القيام تكملة، وليس باش. إذا كانت قذيفة وايماكس متزامنة (على سبيل المثال، باستخدام أوامر pushd، popd أو بعض من وظيفة المستخدم باش الذي يغير الدليل الحالي قذيفة)، وتوقف ثم تكملة العمل.

ولحل هذه المشكلة، فقط اكتب "تطبيق الاستعراض المفصل" في وعاء والأشياء على العودة متزامنة.

ولدي أيضا ما يلي في .emacs بلدي:

(global-set-key "\M-\r" 'shell-resync-dirs)

وبعد ذلك فقط ضرب resyncs خروج العائد لصناعة السيارات في الانتهاء.

وأنا لا أعرف الإجابة على هذا. ولكن السبب أنه لا يعمل كما هو متوقع وربما لأنه يتم التعامل مع الانتهاء في قذائف إيماكس التي كتبها ايماكس داخليا (من قبل وظيفة COMINT حيوي كاملة)، وليس لديها تلك الوظائف الانتهاء ذكية مدمج.

وأخشى أنه ليس بالأمر السهل تحديد.

وتحرير: اقتراح njsf للاستخدام على المدى الوضع هو على الارجح جيدة كما يحصل. تبدأ تشغيله باستخدام

M-x term
يتم تضمينه في توزيع ايماكس معيار (وفي emacs21-شيوعا أو emacs22 شيوعا على أوبونتو وديبيان على الأقل).

وكما قلت Matli، فإنه ليست مهمة سهلة، منذ بدء باش مع --noediting ولا بد TAB إلى COMINT-حيوي كاملة.

واحد يمكن ان rebind TAB إلى إدراج الأوامر النفس في قذيفة COMAND هوك مع المحلي بين مجموعة المفتاح وجعل قذيفة وضع لا يبدأ مع --noediting التي كتبها M-س-تخصيص متغير المتقاعد صريحة-باش-وسائط، ولكن أظن أنه لن يجلس بشكل جيد مع جميع التحرير الأخرى.

وقد ترغب في محاولة الأجل الوضع، لكنه لا يملك مجموعة أخرى من المشاكل، لأن بعض كيبيندينغس العادية الأخرى تجاوزتها الأجل واسطة.

وتحرير: بواسطة keybidings العادية الأخرى التي تجاوزتها الأجل الوضع، أعني جميع ولكن C-ج الذي يصبح هروب لتكون قادرة على تبديل مخازن. وذلك بدلا من C-س ك لقتل عازلة كنت قد لC-ج C-س ك. أو التحول إلى عازلة آخر 'C-ج C-س س "أو" C-ج C-× 2'

من فضلك، النظر في وضع آخر M-x term, ، كما فعلت هذا عندما ظهرت المشكلة في عام 2011.لقد حاولت جمع كل الجهود عبر Inet في ذلك الوقت لجعل الصدفة تعمل مع إكمال Bash، بما في ذلك هذا السؤال.ولكن منذ اكتشاف البديل في مواجهة term-mode لا أريد حتى أن أحاول eshell.

إنه محاكي طرفي كامل، لذا يمكنك تشغيل برنامج تفاعلي بداخله، مثل Midnight Commander.أو التبديل إلى zsh الانتهاء حتى لا تضيع الوقت في تكوين Emacs.

يمكنك الحصول على إكمال TAB في bash مجانًا.ولكن الأهم من ذلك هو أن تحصل على قوة Readline الكاملة، مثل البحث عن الأوامر التزايدية أو البادئة.لجعل هذا الإعداد أكثر ملاءمة، تحقق من ملفي .inputrc, .bashrc, .emacs.

جزء أساسي من .inputrc:

# I like this!
set editing-mode emacs

# Don't strip characters to 7 bits when reading.
set input-meta on

# Allow iso-latin1 characters to be inserted rather than converted to
# prefix-meta sequences.
set convert-meta off

# Display characters with the eighth bit set directly rather than as
# meta-prefixed characters.
set output-meta on

# Ignore hidden files.
set match-hidden-files off

# Ignore case (on/off).
set completion-ignore-case on

set completion-query-items 100

# First tab suggests ambiguous variants.
set show-all-if-ambiguous on

# Replace common prefix with ...
set completion-prefix-display-length 1

set skip-completed-text off

# If set to 'on', completed directory names have a slash appended. The default is 'on'.
set mark-directories on
set mark-symlinked-directories on

# If set to 'on', a character denoting a file's type is appended to the
# filename when listing possible completions. The default is 'off'.
set visible-stats on

set horizontal-scroll-mode off

$if Bash
"\C-x\C-e": edit-and-execute-command
$endif

# Define my favorite Emacs key bindings.
"\C-@": set-mark
"\C-w": kill-region
"\M-w": copy-region-as-kill

# Ctrl+Left/Right to move by whole words.
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# Same with Shift pressed.
"\e[1;6C": forward-word
"\e[1;6D": backward-word

# Ctrl+Backspace/Delete to delete whole words.
"\e[3;5~": kill-word
"\C-_": backward-kill-word

# UP/DOWN filter history by typed string as prefix.
"\e[A": history-search-backward
"\C-p": history-search-backward
"\eOA": history-search-backward
"\e[B": history-search-forward
"\C-n": history-search-forward
"\eOB": history-search-forward

# Bind 'Shift+TAB' to complete as in Python TAB was need for another purpose.
"\e[Z": complete
# Cycling possible completion forward and backward in place.
"\e[1;3C": menu-complete                    # M-Right
"\e[1;3D": menu-complete-backward           # M-Left
"\e[1;5I": menu-complete                    # C-TAB

.bashrc (نَعَم!يوجد دابريف في باش من أي كلمة فيه ~/.bash_history):

set -o emacs

if [[ $- == *i* ]]; then
  bind '"\e/": dabbrev-expand'
  bind '"\ee": edit-and-execute-command'
fi

.emacs لجعل التنقل مريحًا في المخزن المؤقت للمصطلح:

(setq term-buffer-maximum-size (lsh 1 14))

(eval-after-load 'term
  '(progn
    (defun my-term-send-delete-word-forward () (interactive) (term-send-raw-string "\ed"))
    (defun my-term-send-delete-word-backward () (interactive) (term-send-raw-string "\e\C-h"))
    (define-key term-raw-map [C-delete] 'my-term-send-delete-word-forward)
    (define-key term-raw-map [C-backspace] 'my-term-send-delete-word-backward)
    (defun my-term-send-forward-word () (interactive) (term-send-raw-string "\ef"))
    (defun my-term-send-backward-word () (interactive) (term-send-raw-string "\eb"))
    (define-key term-raw-map [C-left] 'my-term-send-backward-word)
    (define-key term-raw-map [C-right] 'my-term-send-forward-word)
    (defun my-term-send-m-right () (interactive) (term-send-raw-string "\e[1;3C"))
    (defun my-term-send-m-left () (interactive) (term-send-raw-string "\e[1;3D"))
    (define-key term-raw-map [M-right] 'my-term-send-m-right)
    (define-key term-raw-map [M-left] 'my-term-send-m-left)
    ))

(defun my-term-mode-hook ()
  (goto-address-mode 1))
(add-hook 'term-mode-hook #'my-term-mode-hook)

كأي أوامر معتادة كما C-x o لا تعمل في وضع المحاكاة الطرفية لقد قمت بتوسيع خريطة المفاتيح باستخدام:

(unless
    (ignore-errors
      (require 'ido)
      (ido-mode 1)
      (global-set-key [?\s-d] #'ido-dired)
      (global-set-key [?\s-f] #'ido-find-file)
      t)
  (global-set-key [?\s-d] #'dired)
  (global-set-key [?\s-f] #'find-file))

(defun my--kill-this-buffer-maybe-switch-to-next ()
  "Kill current buffer. Switch to next buffer if previous command
was switching to next buffer or this command itself allowing
sequential closing of uninteresting buffers."
  (interactive)
  (let ( (cmd last-command) )
    (kill-buffer (current-buffer))
    (when (memq cmd (list 'next-buffer this-command))
      (next-buffer))))
(global-set-key [s-delete] 'my--kill-this-buffer-maybe-switch-to-next)
(defun my--backward-other-window ()
  (interactive)
  (other-window -1))
(global-set-key [s-up] #'my--backward-other-window)
(global-set-key [s-down] #'other-window)
(global-set-key [s-tab] 'other-window)

علما بأنني أستخدم super مفتاح ذلك term-raw-map وربما لا تتعارض أي خريطة مفاتيح أخرى مع روابط المفاتيح الخاصة بي.ليصنع super المفتاح من اليسار Win المفتاح الذي أستخدمه .xmodmaprc:

! To load this config run:
!   $ xmodmap .xmodmaprc

! Win key.
clear mod3
clear mod4

keycode 133 = Super_L
keycode 134 = Hyper_R
add mod3 = Super_L
add mod4 = Hyper_R

عليك فقط أن تتذكر أمرين: C-c C-j - للدخول إلى وضع تحرير Emacs العادي (للنسخ أو الدمج في النص المؤقت)، C-c C-k - للعودة إلى وضع المحاكاة الطرفية.

اختيار الماوس و Shift-Insert العمل كما في xterm.

وأنا استخدم مقدمة وعندما ضرب ميتا + تبويب اكتمال بالنسبة لي.

وأيضا، السيطرة + ط يبدو أن تفعل الشيء نفسه.

وأنا استخدم وضع رأس. لقد كانت عليه هذه الوظيفة (بعد الضغط على "TAB"):

وأنا لا يدعي إلى أن يكون خبيرا ايماكس ولكن هذا يجب ان تحل مشكلتك:

إنشاء: ~ / .emacs

وإضافة إلى ذلك:

و(تتطلب شل الأوامر) (شل الأوامر الإنجاز واسطة)

وإيماكس تتولى قذيفة إعدادات باش حتى لا تحمل من خلال. هذا وسوف يحدد الانتهاء السيارات لEMACS نفسها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top