2010-01-20 9 views
27

Sembra che ci siano molti meccanismi di completamento automatico alternativi di Emacs. Senza una ricerca esauriente, vengono in mente: ido, auto-completamento, ghiaccioli, completamento del buffer, completamento minibuffer e completamento standard fuori dalla scatola. E poi c'è il completamento del codice. Un sacco. E molto dipende dal linguaggio. Sarebbe molto utile avere un guru di Emacs, o tre, riassumere i vantaggi dei principali attori nel completamento automatico di codice e non di codice. E trattandosi di Stack Overflow, è ovvio che sarebbe opportuno identificare le modalità di completamento automatico che funzionano meglio per i meccanismi di tipo IDE di Emacs.Scoprire le opzioni della modalità di completamento di Emacs

Aggiornamento: Ho appena scoperto the Emacs Wiki completion page che amplifica la mia domanda di base: di tutte queste scelte, ciò che è buono, ciò che è meno buono e se si potesse giocare solo con 2-3 che mi consiglia?

risposta

7

Generalmente utilizzo due pacchetti di completamento (diversi dal completamento TAB incorporato nei buffer minibuffer e comint).

pabbrev.el - che fornisce un suggerimento al cursore (premere TAB) per accettare. Le scelte sono fatte guardando la frequenza delle parole. Mi piace per l'indicazione visiva di ciò che sarebbe stato completato, ma per lo più funziona solo per un completamento.

hippie-expand - che è generalmente legato a M-/ al posto di dabbrev perché fa tutto ciò che dabbrev fa e altro. Funziona bene quando potresti aver bisogno di scorrere alcune alternative o se vuoi completare un nome file o qualcos'altro.

Mi piacciono entrambi perché non richiedono alcun movimento del mouse e funzionano rapidamente.

4

Uso il completamento della scheda standard nel minibuffer per i nomi di file, i comandi M-x e altre cose.

Inoltre, utilizzo spesso il tasto M-/ (dabbrev-expand) per il completamento dinamico di qualsiasi parola in uno dei buffer Emacs. È fantastico, specialmente per nomi variabili lunghi. Ecco la documentazione:

 
M-/ runs the command dabbrev-expand, which is an interactive 
autoloaded Lisp function in `dabbrev.el'. 

It is bound to M-/. 

(dabbrev-expand ARG) 

Expand previous word "dynamically". 

Expands to the most recent, preceding word for which this is a prefix. 
If no suitable preceding word is found, words following point are 
considered. If still no suitable word is found, then look in the 
buffers accepted by the function pointed out by variable 
`dabbrev-friend-buffer-function'. 

A positive prefix argument, N, says to take the Nth backward *distinct* 
possibility. A negative argument says search forward. 

If the cursor has not moved from the end of the previous expansion and 
no argument is given, replace the previously-made expansion 
with the next possible expansion not yet tried. 

The variable `dabbrev-backward-only' may be used to limit the 
direction of search to backward if set non-nil. 

See also `dabbrev-abbrev-char-regexp' and C-M-/. 
4

Si può guardare alla società-mode o un pacchetto di completamento automatico, che potrebbe utilizzare diverse fonti di completamento, tra cui CEDET, e anche permettere di definire nuove fonti di completamento ... Per alcuni linguaggi di programmazione , è possibile utilizzare direttamente CEDET ...

+2

significa probabilmente http://cx4a.org/software/auto-complete/index.html, nessuno lo ha menzionato. È il migliore della mia esperienza. – VitoshKa

+0

Sì, intendo questo pacchetto - dimentico sempre che contiene il segno "-" e quale no ;-) –

8

Wrt Icicles -

Per la maggior parte, Icicles è di circa minibuffer completamento. Ci sono alcuni casi in cui offre qualcosa per il completamento del buffer (ad esempio il codice), ma riguarda principalmente il completamento del minibuffer.

Quando la maggior parte delle persone pensa al completamento del minibuffer, pensano al completamento del nome del file, al completamento del nome del buffer e al completamento del nome del comando. Ma c'è un lotto in più.

Come programmatore Emacs-Lisp, è possibile utilizzare il completamento ovunque si desideri offrire agli utenti una scelta interattiva. È piuttosto generale!

Il completamento è in realtà circa di corrispondenza del modello per definire i set, che è possibile quindi modificare.

La maggior parte delle persone pensa che l'unico scopo del completamento del minibuffer sia scegliere un singolo nome (file, buffer, comando, variabile, ...). Ma il potere di completamento è davvero quello di filtrare e possibilmente ordinare l'insieme completo di nomi di file, nomi di buffer, ecc. In diversi modi, e quindi di lasciare che gli utenti facciano qualcosa con o con il risultato impostato (non necessariamente un singolo oggetto) .

Questo è ciò che Ghiaccioli è circa: che ti permette di dinamicamente (in modo incrementale) definire set con schema-matching, e poi agire sui membri selezionati o tutti i membri di tali gruppi.

Questo non è tanto lo scopo di Ido o gli altri pacchetti di completamento, con la possibile eccezione di timone (Tutto).

differenza Helm (Anything), che privilegia oggetto nomi oltre tipi di oggetti e azioni come punto di partenza, in Icicles in genere richiamare un comando di fare qualcosa a uno o più oggetti di un dato tipo (ad esempio, buffer) e quindi si restringe il set di tali oggetti, in genere per corrispondenza dei nomi. È spesso il caso in Icicles che è possibile agire su quegli oggetti in più modi collegati nello stesso comando.

In Helm (Anything), in generale, l'input è abbinato prima per argomento contro l'intero universo di oggetti di tutti i tipi, e poi a limitare giù a raccogliere alcune operazioni (s) per eseguire.

Infine, tieni presente che ciascuno dei vari approcci di completamento offre sia qualcosa (ad es. Comandi) per gli utenti finali che qualcosa (ad esempio funzionalità di completamento) per i programmatori.

Se stai facendo il completamento del codice poi in genere vuole solo completare il nome al punto. La cosa principale interessante riguardo al completamento del codice è determinare quali sono i candidati appropriati. Per questo, il contesto testuale (ad esempio il codice) è tipicamente importante. Per offrire scelte intelligenti, la funzione di completamento deve analizzare il contesto (codice), compreso qualsiasi contesto comprensivo (ad esempio il codice del progetto).

Il completamento del minibuffer d'altra parte può essere utilizzato per qualsiasi tipo di scelta e azione, compresa la scelta multipla con più azioni. Qui, tutte le parti sono interessanti: cosa possono offrire i candidati, cosa puoi fare con loro, ecc.

Non so se questo aiuti, ma questo è comunque il mio obiettivo.