Pergunta

Eu queria saber como as pessoas costumam navegar através de grandes projetos com diversos arquivos de origem em ambiente Linux. I principalmente o trabalho com C e python e às vezes com C ++, C # e Java.

Eu queria saber editores específicos, plugins etc Eu costumava programa em janelas para que editores como vi e emacs não estão realmente na minha liga, mas se você pensar se ele poderia ser realmente útil para mim aprender um desses editores por favor sugerir isso e quaisquer plug-ins específicos que você usa para tornar sua vida mais simples com o gerenciamento de grandes projetos com estes programas.

Aqui estão alguns cenários: Vamos dizer que estou trabalhando em uma função específica A em arquivo F, e, de perceber que eu súbita que esta função precisa para funcionar chamada B em arquivo G. eu rapidamente necessidade de navegar para que função para determinar coisas como parâmetros de função, dar uma olhada rápida na função etc. Outro cenário estaria trabalhando em dois locais diferentes de uma só vez em um arquivo e alternar rapidamente entre estes dois locais.

Estou usando o eclipse para gerenciar meu projeto e fazer o desenvolvimento (auto conclusão do eclipse é dolorosamente lento) e geany para editar arquivos individualmente, mas parece que eu realmente não pode chegar a esse nível de eficiência.

Por favor, compartilhe suas técnicas de gestão e de navegação de código.

Obrigado,

EDIT: línguas

Foi útil?

Solução

Emacs com etags - ver, por exemplo EmacsWiki em Etiquetas - como o Emacs' modos padrão de trabalho para todos os idiomas que me interessa: R, C ++, C, shell, Perl, Python, SQL, ... e provavelmente também os que você está depois. A exuberante Ctags generalizar isso para mais idiomas e editores, incluindo a família vi.

Outras dicas

Para amantes vim (como eu): O Vim + ctags faz grande trabalho. Também grep é seu melhor amigo.

Bem, que tipo de código que você está falando? C ++ / java / php / ruby ??/ python Eu recomendo netbeans, especialmente o mais recente dev constrói, Também KDevelop para o KDE 4.2 (a partir do SVN) é muito bom, o / # suporte php C é muito experimental, mas se você não se importa o acidente aleatório é realmente bom. Netbeans é de longe o IDE mais estável para php / java / c ++ em linux, se você não se importa de instalar java para executá-lo.

Para grepping em arquivos, ack é melhor do que grep real.

Para navegar entre os arquivos, aliás festança que corre kwrite no fundo juntamente com a conclusão do bash para nomes de arquivos é suficiente para mim.

Você pode usar MonoDevelop para c ++. Vai ser uma experiência muito semelhante ao que você teve com o Windows / VS.Net.

Eu sou um grande fã de IntelliJ . Seu slogan diz tudo: "Desenvolver com prazer". Claro, isso pressupõe que você estiver usando Java. Embora ele tem plugins suportados para vários outros idiomas, incluindo Python.

muitas vezes eu uso Doxygen quando eu preciso entender o código de outra pessoa. Eu uso o Vim com CTags ao escrever meu próprio código.

Dê uma olhada Kscope . Ele fornece um menu do botão direito para dar-lhe as definições, referências, função de chamada, chamadas de funções etc ... para qualquer conjunto de arquivos de origem escrito em C. É confiável e rápido quando usado em grande projeto.

Eu usá-lo para navegação fonte, mas para a parte de edição, eu me sinto mais confortável com geany . Ele não se limita a C, e fornece um bom recurso de auto-completar, que irá fornecer o protótipo de uma função enquanto você digita. Ainda tem algumas arestas, mas a combinação Kscope + Geany é meu combo favorito para agora, quando se trata de escrever C.

Eu uso o Eclipse e fazer uso pesado da função de pesquisa (para C principalmente pesquisa de texto).

Eu também tenho dicas de ferramentas habilitado, que pode mostrar a documentação ou início de uma função.

Marcar ocorrências também é útil para encontrar coisas dentro de um arquivo.

Eu normalmente marcam lugares onde trabalho com os comentários TODO. Estes são visíveis na barra lateral, por isso é relativamente fácil de navegar até lá.

Eu também permitir que os números de linha, para correlacionar com mensagens de erro e tal.

Eu não acho que é possível editar o mesmo arquivo em duas janelas diferentes em Eclipse (mas eu ficaria feliz de ser provado errado).

Eu estou usando gvim (versão GUI do Vim) para a maioria de programação Perl e C / C ++. Para uma navegação Acho NERDTree , ctags, ack e, possivelmente, alguns scripts personalizados escritos em Perl ou qualquer outra coisa. Eu coloquei minha Vim / gvim configuração no meu site. Como se pode ver lá, eu tenho "para $ VIMRUNTIME / mswin.vim" não há o que torna Vim muito mais semelhante ao editor do Windows, e mais familiar para as pessoas que vêm a partir dele. Muitos especialistas vim hard-core não recomendo usá-lo, mas eu ainda faço.

Há muitos outros plugins mais em do Vim homepage o que pode ser útil.

Eu uso muitos dos itens listados: doxygen, GATE, etc. No entanto, na maioria dos casos eu encontrei um bem afinado achado-grep executado a partir de emacs pode ser muito eficaz na busca grandes bases de código. Ainda trabalhando na criação de CEDET e sematic.

Aqui está algum código lisp que escrevi para uma árvore fonte específica e os mapeamentos para estas funções em meu .emacs. O código cria um grande comando find-grep que começa na raiz da árvore de origem estou dentro de trabalhar. Atravessa-se o sistema de arquivos em busca de algum arquivo que indica o topo da árvore fonte (makefile no meu caso). I sintonizado-lo até que ele pudesse completar a pesquisa em poucos segundos (eu realmente escrevi um script python para me ajudar a identificar grandes tipos de arquivos binários que foram retardando minha busca para baixo).

(global-set-key (quote[f3]) (quote set-fg-suffix))
(global-set-key (quote[f4]) (quote fg))

(defun mkpath (list)
  "Return a string which is the concatenation of the list."
  (let ( (result "") )
    (while list
      (setq result (concat result (car list)))
      (setq result (concat result "/"))
      (setq list (cdr list))
      )
    result ; Since this is the final evaluation, it's the returned from the function.
    )
  )

(defun find-best-root (anchor-file &optional empty-on-failure)
  "Examines the parent directories of the current buffer.  Looks for a parent that contains the
file passed in the anchor-file argument.  This is the directory I want."

  (if (not buffer-file-name)
      ;; Certain buffer (e.g., *scratch*) return nil from buffer-file-name.  In that case,
      ;; set the best path to "/" since that's the only path which can be counted on.
      (if (eq nil empty-on-failure)
          "/"
        ""
        )
    (let ((path-depth (safe-length (split-string (file-name-directory buffer-file-name) "/" 1)))
          (best-root (if (eq nil empty-on-failure)
                         (file-name-directory buffer-file-name)
                       ""))
          (exclude-from-path 1))
      (while (<= exclude-from-path (+ path-depth 1))
        (setq path-as-list (butlast (split-string (file-name-directory buffer-file-name) "/") exclude-from-path))
        (setq potential-root (mkpath path-as-list))
        (message (concat "Checking in " potential-root))
        (if (file-exists-p (concat potential-root anchor-file))
            (progn (setq best-root potential-root)
                   (setq exclude-from-path (+ path-depth 2)) ;; Break from the loop.
                   (message (concat "Found " anchor-file)))
          (setq exclude-from-path (+ exclude-from-path 1)))
        )
      best-root
      )
    )
  )

(if (eq system-type 'gnu/linux)
    (progn (setq marker-file "makefile")
           (setq find-filters (concat " -type d "
                                      "-path \"*/build\" -prune -o "
                                      "-path \"*/.git\" -prune -o "
                                      "-path \"*/ext\" -prune -o "
                                      "-path \"*/pycommon\" -prune -o "
                                      "\"(\" "
                                      "\! -iname \"BROWSE\" "
                                      "-and \! -iname \"FILES\" "
                                      "-and \! -iname \"TAGS\" "
                                      "-and \! -iname \"*.a\" "
                                      "-and \! -iname \"*.bin\" "
                                      "-and \! -iname \"*.cs\" "
                                      "-and \! -iname \"*.css\" "
                                      "-and \! -iname \"*.d\" "
                                      "-and \! -iname \"*.dat\" "
                                      "-and \! -iname \"*.html\" "
                                      "-and \! -iname \"*.ico\" "
                                      "-and \! -iname \"*.jar\" "
                                      "-and \! -iname \"*.json\"  "
                                      "-and \! -iname \"*.o\" "
                                      "-and \! -iname \"*.pdf\" "
                                      "-and \! -iname \"*.php\" "
                                      "-and \! -iname \"*.png\" "
                                      "-and \! -iname \"*.pyc\" "
                                      "-and \! -iname \"*.so\" "
                                      "-and \! -iname \"*.sql\" "
                                      "-and \! -iname \"*.txt\" "
                                      "-and \! -iname \"*.xml\" "
                                      "\")\" "
                                      "-print0 | xargs -0 grep -nHi -e "))
           ))

(setq custom-find-grep-path-suffix "")
(defun set-fg-suffix (suffix)
  "Set an optional suffix for the search.  This is useful for more fine grained searching."
  (interactive "sEnter Search Suffix: ")
  (if (string= "" suffix)
      (message "The optional search suffix is now empty.")
    (message (concat "The optional search suffix is now '" suffix "'."))
    )
  (setq custom-find-grep-path-suffix suffix)
)


(defun fg ()
  "A custom find grep that dynamically sets the search path based on the buffer.
Regular Expression Examples:
-E \"struct.*hash\"  When using special characters, enclose regexp in quotes.
-E \"^text$\"        ^ Matches beginning of line,  $ matches end of line.
-E \"main\\(.*\\)\"  .* Matches everything, parenthesis require escaping."
  (interactive)
  (let ((fg-tt-filters find-filters ))
    (setq my-find-grep-command "find \"")
    (setq my-find-grep-command (concat my-find-grep-command (find-best-root marker-file)))
    (setq my-find-grep-command (concat my-find-grep-command custom-find-grep-path-suffix))
    (setq my-find-grep-command (concat my-find-grep-command "\""))
    (setq my-find-grep-command (concat my-find-grep-command fg-tt-filters))
    (grep-apply-setting 'grep-find-command my-find-grep-command)
    (call-interactively 'find-grep)
  )
)

Spacemacs integrado com projétil é uma escolha agradável.

Pode-se pesquisar arquivos de projeto usando utilitários como o ack, grp, ag .

(ag é melhor do que ack ou grep)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top