Is there a way to center text like this?
-
Tnx for your help!
-
Not default. Notepad++ is a text editor with no concept of a right margin like a word processor. That said, you can add a guideline for a right column (i.e., “margin”) and with a scripting language, you can create a “justify” script to left, right or center justify text based on the right column you select (of a default one).
Here is a “PerlScript” example:
#!perl use strict; use warnings; use Getopt::Long qw(:config no_ignore_case); use Pod::Usage; use Win32::Mechanize::NotepadPlusPlus ':main'; my $justify = 'l'; my $width = editor->getEdgeColumn(); if ( $width == 0 ) { $width = 80; } sub justify { $justify = $_[0]; $width = $_[1] if ( $_[1] =~ /^\d+$/ ); } GetOptions( 'c|center:s' => \&justify, 'l|left' => \&justify, 'r|right:s' => \&justify, 'help!' => sub { pod2usage( -verbose => 1 ) }, 'man!' => sub { pod2usage( -verbose => 2 ) } ) or pod2usage( -verbose => 0 ); my $txt = editor->getSelText(); if ( $txt eq "\0" or length($txt) < 1 ) { pod2usage( -verbose => 0, -message => "$0: select text to justify" ); } my $eol = ( "\r\n", "\r", "\n" )[editor->getEOLMode()]; my @lines = split /$eol/, editor->getSelText(); editor->beginUndoAction(); for my $line (@lines) { chomp $line; $line =~ s/^\s*//; $line =~ s/\s*$//; my $space = 0; if ( $justify eq "c" ) { $space = int( ( $width - length($line) ) / 2 ); } elsif ( $justify eq "r" ) { $space = int( $width - length($line) ); } $space = 0 if ( $space < 0 ); editor->replaceSel( " " x $space . "$line$eol" ); } editor->endUndoAction(); __END__ =head1 NAME Justify - Justify text. =head1 SYNOPSIS justify [options] =head1 DESCRIPTION Make a selection in Notepad++ to justify text left, right or center. Width for center and right is determined by SCI_GETEDGECOLUMN. If 0, default 80 assumed. =head1 OPTIONS -c [width] Center justify. Optional width. [Default] -l Left justify. -r [width] Right justify. Optional width. --help Print Options and Arguments. --man Print complete man page. =head1 LICENSE This software is released under the same terms as Perl itself. If you don't know what that means visit L<http://perl.com/>. =head1 AUTHOR Copyright (c) 2020 Michael Vincent L<http://www.VinsWorld.com> All rights reserved =cut
-
Hello, @hello313241, @michael-vincent, and All,
Seemingly, the center feature should take the zoom factor in account ! Indeed, for instance, if a text block is centered for default zoom, it will not be centered if you zoom in or out !
So here is a regex method which needs
5
consecutive search /replacement, described below. Luckily, you just can save these S/R in a macro and even give it a shortcut to trigger it after selection of some text ;-)For instance, on my laptop, with default zoom (
Ctrl + Numpad /
) and using the monospaced fontConsolas
, I can write140
character per line. As you’ll probably get an other number, simply insert the appropriate number of space characters in theReplace
zone of the second S/R !So, to center a line(s) selection we need the different regex S/R, below :
-
The first S/R deletes any leading and trailing blank characters in each line of the selection
-
SEARCH
^\h+|\h+$
-
REPLACE
Leave EMPTY
-
-
The second S/R appends
140
space chars at end of each line of the selection-
SEARCH
$
-
REPLACE
A string of 140 SPACE characters
-
-
The third S/R deletes any range of space characters present after position
140
:-
SEARCH
(?-s)^.{140}\K\x20+
-
REPLACE
Leave EMPTY
-
-
The fourth S/R, where the centering operation occurs, surrounds each effective text with half the number of space chars of each line of the selection :
-
SEARCH
(?-s)^(.*[^ \r\n])(\x20+)\2\x20?$
-
REPLACE
\2\1\2
-
-
Finally, the fifth S/R simply trims all the trailing space characters of each line of the selection :
-
SEARCH
\h+$
-
REPLACE
Leave EMPTY
-
As promised, here is the macro, which runs, successively, these
5
regex S/R on each line of your selection :<Macro name="Center Selected Lines" Ctrl="no" Alt="no" Shift="no" Key="0"> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="^\h+|\h+$" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="$" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam=" " /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="(?-s)^.{140}\K\x20+" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="(?-s)^(.*[^ \r\n])(\x20+)\2\x20?$" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="\2\1\2" /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="\h+$" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> </Macro>
Remark : In the second block, note the line
<Action type="3" message="1602" wParam="0" lParam="0" sParam="...................... />"
which contains140
space characters. Adapt the number of spaces as needed, depending of your screen configuration and of the N++ margin(s), font, and zoom factor used !-
Close any N++ instance
-
Insert this new macro in the
<Macros>...........</Macros>
section of your activeShortcut.xml
file -
Restart Notepad++
-
Do a normal selection of some text and… enjoy !
Best Regards,
guy038
-
-
@guy038 said in Is there a way to center text like this?:
So here is a regex method which needs 5 consecutive search /replacement, described below. Luckily, you just can save these S/R in a macro and even give it a shortcut to trigger it after selection of some text ;-)
I got to thinking and came up with this which appears to perform the same but in less steps and doesn’t need the use of the
\K
function.I used 80 characters as the width, but I think any number is okay (it has to be an even number). Steps are:
-
Removal of leading and trailing spaces is recommended, I’ll borrow @guy038 regex.
Find What:^\h+|\h+$
replace With: leave this field empty -
Add half of the spaces to both start and end of line. One benefit is only having to type HALF the spaces required! ;-)
Find What:^|$
Replace With: -
Find the middle 80 characters.
Find What:^( +)(.{80}\1
Replace with:\2
-
Remove trailing spaces using the Blank Operations, Trim Trailing Spaces.
A note, I had originally tried
^( +)(.{80}\1$
, note the$
, in effect forcing it to go to end of line marker, but that missed some lines, I didn’t do any further testing, just removed the$
. As the+
is greedy it will still attempt to capture the whole line anyways.Terry
-
-
@Terry-R said in Is there a way to center text like this?:
Removal of leading and trailing spaces is recommended
Just figured I can remove existing leading and trailing spaces and ALSO insert the required “HALF the spaces” in the one step. So:
Find What:^(\h+)?|(\h+)?$
Replace With:Followed by step 3 above and then the final step 4 of removing trailing spaces.
Terry
-
Hi, @hello313241, @michael-vincent, @terry-r and All,
Very, very clever solution Terry ! Indeed, no need for
\K
and just to type in half the screen size of spaces, in the Replace zone ;-))And I also improved the process as we do not need, any more, to trim the trailing blank chars at the end. In addition to the mandatory regex part
.{80}
, I placed, before, a look-ahead(?=(.+[^\x20\r\n])\x20+)
which splits these80
characters in two zones :-
A first zone
(.+[^\x20\r\n])
which must end with a non-blank and Non-EOL character, to rewrite in replacement (\2
) -
A second zone
\x20+
of blank characters only, to ignore
So we need two regex S/R, only ( Note that I follow my previous post with
140
characters for screen size )- The first S/R removes possible blank chars of a pure blank line OR replace any range, possibly null, of leading and trailing blank chars with
70
space characters (140 / 2
)
SEARCH
^\h*$|(^\h*|\h*$)
REPLACE
?1
<followed with70
spaces>- The second S/R replaces any full line of the selection, magically, with the range of
( 140 - L ) / 2
space chars, followed by the text to be centered, of sizeS
:
SEARCH
(?-s)^(\x20*)(?=(.+[^\x20\r\n])\x20+).{140}\1\x20?
REPLACE
\2
Remarks :
-
As the total of any line of the selection is
140 + S
characters long, thus the length of the surrounded range\1
isS/2
characters -
I had to add the final
\x20?
regex because, in case the sizeS
is an odd number, this extra space char is also matched and deleted after replacement ! -
All lines of the selection must have a size inferior or equal to
140
. Lines, with size over140
, are shifted by140 / 2
space characters !
So, the final macro is now simplified as :
<Macro name="Center Selected Lines" Ctrl="no" Alt="no" Shift="no" Key="0"> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="^\h*$|(^\h*|\h*$)" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="?1 " /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> <Action type="3" message="1700" wParam="0" lParam="0" sParam="" /> <Action type="3" message="1601" wParam="0" lParam="0" sParam="(?-s)^(\x20*)(?=(.+[^\x20\r\n])\x20+).{140}\1\x20?" /> <Action type="3" message="1625" wParam="0" lParam="2" sParam="" /> <Action type="3" message="1602" wParam="0" lParam="0" sParam="\2" /> <Action type="3" message="1702" wParam="0" lParam="640" sParam="" /> <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" /> </Macro>
For instance, this initial text, where I used some sentences from the
License.txt
file and add some trailing blank chars :This example works ONLY IF the TOTAL size of your SCREEN contains 140 characters ADAPT to your CONFIGURATION, by adding HALF the APPROPRIATE number of SPACES, after "?1", in the REPLACEMENT zone of the 2ND regex S/R >< >< >< Copyright (C)2016 Don HO <don.h@free.fr> The licenses for most software are designed to take away your freedom to share and change it 1 Copyright (C) 1989, 1991 Free Software Foundation, Inc. ABCD Everyone is permitted to copy and distribute verbatim copies You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee 12345 12345 12345 12345 12345 az 1 To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. 1234567890 >< >< ><
Would be modified and centered as below :
This example works ONLY IF the TOTAL size of your SCREEN contains 140 characters ADAPT to your CONFIGURATION, by adding HALF the APPROPRIATE number of SPACES, after "?1", in the REPLACEMENT zone of the 2ND regex S/R >< >< >< Copyright (C)2016 Don HO <don.h@free.fr> The licenses for most software are designed to take away your freedom to share and change it 1 Copyright (C) 1989, 1991 Free Software Foundation, Inc. ABCD Everyone is permitted to copy and distribute verbatim copies You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee 12345 12345 12345 12345 12345 az 1 To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. 1234567890 >< >< ><
Best Regards,
guy038
-