7
votes

Existe-t-il un moyen de faire de «remplir-paragraphe» à la fin d'une phrase?

Il est parfois souhaitable de démarrer chaque phrase dans un paragraphe sur une ligne distincte. Par exemple, cela facilite la diffusion de documents texte différents, car une modification d'une phrase n'affectera pas le paragraphe entier. Certains systèmes de balisage (par exemple * * Roff) nécessitent également que chaque phrase commence sur une nouvelle ligne.

Y a-t-il un moyen, par exemple. par judicieuse redéfinition de paragraphe-distinct code> et paragraphe-start code>, pour faire remplir-paragraphe code> arrêter entre phrases? p>

( REMARQUE: J'utilise EMACS 23.3.1) P>


Mise à jour: Exemple MDOC (* ROFF) Marquage: P>

The
.Nm
utility makes a series of passes with increasing block sizes.
In each pass, it either reads or writes (or both) a number of
non-consecutive blocks at increasing offsets relative to the ideal
alignment, which is assumed to be multiples of the block size.
The results are presented in terms of time elapsed, transactions per second and kB per second.


0 commentaires

3 Réponses :


1
votes

Que diriez-vous de raconter paragraphe-start code> pour rechercher une ligne qui commence par une lettre majuscule: xxx pré>

Notez que la nouvelle partie est \\ ^ [Az] code> p>

qui devrait fonctionner dans la plupart des cas, il suffisait de surveiller les rares cas où vous avez une peine de mi-phrase capitale et que cette phrase est suffisamment longue. à la pause juste avant ce mot à mi-phrase. p>

EDIT: Vous voulez probablement rendre compte de l'indentation aussi: p> xxx pré>

L'espace entre les crochets contient Un espace et un onglet. P>

EDIT: Vous devez désactiver Case-Fold-Search Code> Pour que cela fonctionne, sinon les majuscules et les lettres minuscules ne se distinguent pas dans le match! p>

Edit: Si vous souhaitez désactiver la recherche de cas-lachez de cette fonction, liez les points suivants à MQ code> (que vous pouvez faire localement ou globalement, comme vous le voyez bien. ). P>

(defun my-fill-paragraph ()
  (interactive)
  (let ((case-fold-search nil))
    (fill-paragraph)))


12 commentaires

HMM, si la syntaxe REGEXP de EMACS prend en charge les assertions de l'aspect de longueur variable de largeur zéro, il devrait être possible de construire une regexpe qui correspond au Perl Re / \. (?: \ N \ s {2,} ) \ K \ s / s , qui correspond au premier caractère non-blancs après une période suivie d'un caractère nouveau ou d'au moins deux caractères blancheurs.


Tu m'as perdu. Quand est-ce que la Regexp j'ai posté échec? Je suppose que vous frappez manuellement le retour après chaque phrase que vous les entrez, de sorte que Emacs n'a pas à diviser les paragraphes pour vous, il doit simplement respecter les limites de la peine lors du remplissage.


Je ne pense pas que Emacs soutient les assertions non plus.


Les lettres majuscules n'indiquent pas nécessairement le début d'une nouvelle séquence. Par exemple, dans votre premier commentaire, vous avez capitalisé un mot au milieu de la troisième phrase.


Vrai, mais comme je l'ai mentionné ci-dessus, cela ne tient que lorsqu'il y a une peine de mi-phrase capitale, et elle tombe exactement sur un chevreak. Et même alors, s'il tombe exactement sur une pause à la ligne, la ligne va toujours casser à l'endroit où vous le souhaitez. Le boîtier de bord semble assez rare par rapport à l'effort de construction d'une nouvelle fonction de remplissage qui couvre tous les cas possibles;)


Cela évolue la motion de paragraphe et la définition d'un paragraphe, pas seulement le paragraphe de remplissage. L'OP n'a pas dit si c'est ce qu'il veut.


L'OP a dit qu'il souhaitait remplir le paragraphe de ne pas rejoindre des phrases consécutives sur la même ligne, comme l'exige des formats de marque (et est utile pour le contrôle de la révision en général). Il n'a indiqué aucune préférence sur la motion de paragraphe, alors je suppose que ce n'est pas important.


Cela ne me dérange pas de la manière (en ce qui concerne la motion de paragraphe). Je pense que c'est aussi proche que nous allons arriver à ce que je voulais, je vais donc accepter cette réponse.


Oups, non accepté. Il y a quelque chose qui ne va pas avec cette solution: paragraphe de remplissage est maintenant correctement enfreint les longues lignes sans toucher la phrase suivante, mais elle ne joint jamais à des lignes courtes ensemble; Je soupçonne que le REGEXP est appliqué de manière insensible à la casse, il considère donc tout nouvelle ligne un nouveau paragraphe.


Oui, mais je ne veux pas la mettre globalement, ni même localement - je devrais envelopper remplir paragraphe dans une fonction qui le définit à nil puis restaure la valeur, à moins que vous ne puissiez Pensez à quelque chose de plus simple.


Les cas de coin restent non résolus. Modification FILL-Paragarph-Fonction fonctionne plus largement. @Tyler, j'ai été confus parce qu'il dit "Démarrer chaque phrase dans un paragraphe", que j'ai pris pour dire qu'il souhaitait garder les concepts d'une phrase et un paragraphe distinct, mais en modifiant la manière dont les paragraphes sont définis ne l'accomplissent pas. Je laisserai op de clarifier ce qu'il veut réellement.


Cela transforme également efficacement paragraphe de remplissage dans Message de remplissage . Si nous avons commencé à vouloir cela, je pense que la situation serait beaucoup plus facile. :)



1
votes

Ce DTRT?

(defun separate-sentences (&optional beg end)
  "ensure each sentence ends with a new line.
When no region specified, use current paragraph."
  (interactive (when (use-region-p)
                   (list (region-beginning) (region-end))))
  (unless (and beg end)
    (save-excursion
      (forward-paragraph -1)
      (setq beg (point))
      (forward-paragraph 1)
      (setq end (point))))
  (setq end (if (markerp end)
                end
              (set-marker (make-marker) end)))
  (save-excursion
    (goto-char beg)
    (while (re-search-forward (sentence-end) end t)
      (unless (or (looking-at-p "[ \t]*$")
                  (looking-back "^[ \t]*"))
        (insert "\n")))))

(defun fill-paragraph-sentence-groups (justify)
  "Groups of sentences filled together.  A sentence ending with newline marks end of group."
  (save-excursion
    (save-restriction
      (narrow-to-region (progn (forward-paragraph -1) (point))
                        (progn (forward-paragraph 1) (point)))
      (goto-char (point-min))
      (skip-chars-forward " \t\n")
      (while (not (or (looking-at-p paragraph-separate)
                      (eobp)))
        (fill-region (point)
                     (progn
                       (loop do (forward-sentence 1)
                             until (looking-at "[ \t]*$"))
                       (point))
                     justify)
        (unless (looking-back "^[ \t]*")
          (forward-line 1)))
      t)))

(defun fill-paragraph-sentence-individual (justify)
  "Each sentence in paragraph is put on new line."
  (save-excursion
    (separate-sentences)
    (fill-paragraph-sentence-groups justify)))

;; deployment option 1: add to major-mode hook

(add-hook 'text-mode-hook (lambda ()
                            (set (make-local-variable fill-paragraph-function) 'fill-paragraph-sentence-individual)))

;; deployment option 2: call my-fill-paragraph any where

(defun my-fill-paragraph (arg)
  (interactive "*P")
  (let ((fill-paragraph-function 'fill-paragraph-sentence-individual))
    (fill-paragraph arg)))


4 commentaires

La question n'était pas de savoir comment séparer un paragraphe en phrases, mais comment empêcher remplir-paragraphe de les rejoindre.


La question n'est pas très claire. Pouvez-vous ajouter quelques exemples de ce que vous voulez? Voulez-vous également garder le comportement de mouvement de paragraphe actuel?


Je signifie "chaque phrase". Qu'est-ce qui te fait penser que je ne le fais pas?


Vous pouvez avoir les deux manières. Choisissez remplir-paragraphe-phrase-groupes ou remplissage-paragraphe-phrase-individu-individu . IMO La version des groupes est plus puissante car il existe un moyen d'arrêter de casser la phrase.



0
votes

Vous pouvez utiliser Région de remplissage qui, sans surprise, ne remplit que la région actuelle. Sur la base de cela, vous pouvez définir une fonction Message de remplissage . Je suppose qu'un moyen simpliste de détecter de telles phrases est de dire:

  • Si la ligne se termine par un . , ? ou ! , c'est une ligne de fin de phrases. < / p>

  • une ligne commence une phrase si sa ligne prédécesseur est soit vide, soit une ligne de fin de phrase.

    C'est plutôt difficile de le faire fonctionner correctement dans tous les cas, cependant.


1 commentaires

J'espérais une combinaison de paramètres qui rendrait paragraphe de remplissage dTRT.