59 votes

Ouvrir un fichier à la ligne avec la syntaxe "filename:line".

Très souvent, les erreurs de compilation sont affichées avec l'icône file:line la syntaxe.

Ce serait bien de pouvoir copier-coller directement pour ouvrir le fichier à la bonne ligne.

Emacs dispose déjà d'un mode pour gérer cela dans les tampons (mode compilation, je crois), mais j'aimerais que cela soit disponible à partir de la ligne de commande du shell, puisque j'utilise le shell standard la plupart du temps en dehors d'Emacs.

Une idée sur la façon de modifier emacs pour apprendre file:line syntaxe pour ouvrir file à la ligne line ? (évidemment, si file:line existe réellement sur le disque, il doit être ouvert de préférence)

0 votes

J'aimerais voir un moyen d'ouvrir un fichier en passant à emacs une erreur PHP. Cela ressemblerait à ceci : Warning : Invalid argument supplied for foreach() in _drupal_schema_initialize() (line 6866 of /srv/work.electricgroups.com/dave/projects/htdocs/includes/common.inc).

51voto

sanityinc Points 9156

Vous pouvez le faire en utilisant emacsclient. Par exemple, pour ouvrir FILE à la ligne 4, colonne 3 dans un nouveau cadre :

emacsclient +4:3 FILE

Laissez tomber le :3 pour ouvrir simplement le fichier à la ligne 4.

5 votes

Le drapeau "-c" indique de créer un nouveau cadre ; vous n'avez pas besoin de le spécifier pour que le saut à la ligne fonctionne.

0 votes

Bon point - c'était une question de préférence personnelle / d'habitude.

2 votes

Bien qu'il s'agisse d'un fait intéressant, la solution d'Ivan est beaucoup plus fonctionnelle lorsque vous coupez et collez des noms de fichiers à partir de messages d'erreur, comme le dit la question originale.

18voto

Ivan Andrus Points 3519

J'ai les éléments suivants dans mon .emacs mais je ne l'ai pas trouvé aussi utile que je le pensais.

;; Open files and goto lines like we see from g++ etc. i.e. file:line#
;; (to-do "make `find-file-line-number' work for emacsclient as well")
;; (to-do "make `find-file-line-number' check if the file exists")
(defadvice find-file (around find-file-line-number
                             (filename &optional wildcards)
                             activate)
  "Turn files like file.cpp:14 into file.cpp and going to the 14-th line."
  (save-match-data
    (let* ((matched (string-match "^\\(.*\\):\\([0-9]+\\):?$" filename))
           (line-number (and matched
                             (match-string 2 filename)
                             (string-to-number (match-string 2 filename))))
           (filename (if matched (match-string 1 filename) filename)))
      ad-do-it
      (when line-number
        ;; goto-line is for interactive use
        (goto-char (point-min))
        (forward-line (1- line-number))))))

0 votes

Sympa ! Une idée pour intégrer cela dans la fonction d'ouverture par défaut ?

0 votes

Je ne suis pas sûr de ce que vous voulez dire. find-file est la fonction d'ouverture par défaut. Que montre C-h C-k C-x C-f ?

2 votes

"defadvic" modifie la définition du nom suivant (dans ce cas find-file, la fonction d'ouverture par défaut). Donc ce (defadvice find-file ) modifie en fait find-file pour qu'il se comporte de cette façon.

10voto

jacob Points 749

Et voici mon essai. Appelle l'original find-file-at-point

(defun find-file-at-point-with-line()
  "if file has an attached line num goto that line, ie boom.rb:12"
  (interactive)
  (setq line-num 0)
  (save-excursion
    (search-forward-regexp "[^ ]:" (point-max) t)
    (if (looking-at "[0-9]+")
         (setq line-num (string-to-number (buffer-substring (match-beginning 0) (match-end 0))))))
  (find-file-at-point)
  (if (not (equal line-num 0))
      (goto-line line-num)))

0 votes

Je changerais simplement (find-file-at-point) en (find-file (ffap-guesser)). Ainsi, vous n'aurez pas d'invite :)

9voto

Håkon Hægland Points 5103

Vous pouvez utiliser un script bash :

#! /bin/bash
file=$(awk '{sub(/:[0-9]*$/,"")}1' <<< "$1")
line=$(awk '{sub(/^.*:/,"")}1' <<< "$1")
emacs --no-splash "+$line" "$file" &

Si vous appelez ce script pour openline et vous obtenez un message d'erreur, par ex.

Error: file.cpp:1046

vous pouvez faire

openline file.cpp:1046

pour ouvrir le file.cpp sur Emacs à la ligne 1046..

1 votes

Merci, cela m'a aidé ! J'utilise une version légèrement modifiée : emacs --no-splash "+$line" --file "$file"

0 votes

Le code est un peu plus simple si vous utilisez sed au lieu de awk ( file=$(sed 's/:[0-9]*$//' <<< "$1"); line=$(sed 's/^.*://' <<< "$1") ).

8voto

ecmanaut Points 1688

Une autre version du conseil sympa d'Ivan Andrus sur les fichiers de recherche qui fait à la fois la ligne + le numéro de colonne optionnel, comme vous le voyez dans les erreurs de node et coffeescript :

;; Open files and go places like we see from error messages, i e: path:line:col
;; (to-do "make `find-file-line-number' work for emacsclient as well")
;; (to-do "make `find-file-line-number' check if the file exists")
(defadvice find-file (around find-file-line-number
                             (path &optional wildcards)
                             activate)
  "Turn files like file.js:14:10 into file.js and going to line 14, col 10."
  (save-match-data
    (let* ((match (string-match "^\\(.*?\\):\\([0-9]+\\):?\\([0-9]*\\)$" path))
           (line-no (and match
                         (match-string 2 path)
                         (string-to-number (match-string 2 path))))
           (col-no (and match
                        (match-string 3 path)
                        (string-to-number (match-string 3 path))))
           (path (if match (match-string 1 path) path)))
      ad-do-it
      (when line-no
        ;; goto-line is for interactive use
        (goto-char (point-min))
        (forward-line (1- line-no))
        (when (> col-no 0)
          (forward-char (1- col-no)))))))

0 votes

Y a-t-il un moyen de faire en sorte que cela fonctionne pour le 2ème fichier et les suivants sur la ligne de commande lors du démarrage d'emacs ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X