• code memo elisp fixed
    Взять X параграфов текста, размер которых ещё влезает в четыре килобайта. 
    
    (defun byte-count-in-region (start end)
      (string-to-number
       (with-output-to-string (call-process-region start end
    					       "wc" nil standard-output nil
    					       "-c"))))
    (defun select-juickable-paragraph-set ()
      (interactive)
      (let ((start (point))
    	(block-length 4096))
        (while (and (< (byte-count-in-region start (point)) block-length)
    		(< (point) (point-max)))
          (forward-paragraph))
        (if (> (byte-count-in-region start (point)) block-length) 
    	(backward-paragraph))
        (if (<= (point) start)
    	(goto-char start))
        (set-mark start)
        (message "Current region size is small enough for juick")))
    
    Как можно сделать это короче в два раза? И почему в емаксе до сих пор нет какого-нибудь forward-byte?

Replies (3)

  • @Kim, Ещё и wc дергает.
  • @mechmind, Так скажи как посчитать количество байт самим емаксом, а не количество символов.
  • @Kim, Ладно, таки нашел в документации.

    string-bytes, position-bytes и byte-to-position это то что надо.

    Таким образом

    (defun byte-count-in-region (start end) ; функуция больше не нужна
    (string-bytes (buffer-substring-no-properties start end)))
    (defun select-juickable-paragraph-set ()
    (interactive)
    (let* ((start (point))
    (block-length 4096)
    (start-byte (position-bytes start))
    (max-end-byte (+ block-length start-byte))
    (max-end (or (byte-to-position max-end-byte) (point-max))))
    (goto-char max-end)
    (backward-paragraph)
    (forward-paragraph)
    (if (> (point) max-end)
    (backward-paragraph))
    (if (<= (point) start)
    (goto-char start))
    (set-mark start)
    (message "Current region size is small enough for juick")))