mirror of
https://github.com/notepad-plus-plus/notepad-plus-plus.git
synced 2025-08-27 20:58:32 +02:00
Release 5.5.7 (https://www.scintilla.org/scintilla557.zip) Released 8 June 2025 1. Add SCI_SCROLLVERTICAL method to restore view position and maintain it while performing line wrapping. 2. Add SC_UNDO_SELECTION_HISTORY_SCROLL flag to SCI_SETUNDOSELECTIONHISTORY which controls whether undo and redo restore vertical scroll position. 3. Tweak SC_MARK_BAR to be slightly wider by using next higher whole pixel instead of next lower for margin width / 3. 4. Scale images in autocompletion lists with SCI_AUTOCSETIMAGESCALE to match high DPI screens. Initially only on GTK and Qt. 5. Fix wrapping bug for UTF-8 where \r\n could wrap between the characters. Notepad++ Pull Request #16373. 6. Fix crash during painting when scroll bars changed. Bug #2481. 7. On GTK, reset vertical scroll bar synchronously in SCI_SETDOCPOINTER to fix bug where scroll position not restored in non-wrap mode. Bug #2416. 8. On GTK, fix IME problem when tentative composition interfered with delete surrounding. Feature #1476. 9. On GTK, update IME cursor position inside retrieve surrounding to better position candidate window. Feature #1488. Release 5.4.5 (https://www.scintilla.org/lexilla545.zip) Released 8 June 2025 1. Dart: Add error state SCE_DART_STRINGEOL for unterminated string. Pull request #315. 2. Makefile: Add a keyword list to makefile lexer to highlight GNU Make directives like 'ifdef' and 'vpath' as SCE_MAKE_PREPROCESSOR since these are similar to NMAKE directives like '!IFDEF'. 3. Nix: Add error state SCE_NIX_STRINGEOL for unterminated string. Pull request #315. 4. TOML: Add error state SCE_TOML_STRINGEOL for unterminated string. Pull request #315. 5. Zig: Add error state SCE_ZIG_STRINGEOL for unterminated string. Pull request #315. Close #16649
295 lines
11 KiB
Plaintext
295 lines
11 KiB
Plaintext
0 400 400 // coding:utf-8
|
|
0 400 400
|
|
2 400 401 + /// A structure for storing a timestamp, with nanosecond precision (this is a
|
|
0 401 400 | /// multiline doc comment).
|
|
2 400 401 + const Timestamp = struct {
|
|
0 401 401 | /// The number of seconds since the epoch (this is also a doc comment).
|
|
0 401 401 | seconds: i64, // signed so we can represent pre-1970 (not a doc comment)
|
|
0 401 401 | /// The number of nanoseconds past the second (doc comment again).
|
|
0 401 401 | nanos: u32,
|
|
0 401 401 |
|
|
2 401 402 + /// Returns a `Timestamp` struct representing the Unix epoch; that is, the
|
|
0 402 401 | /// moment of 1970 Jan 1 00:00:00 UTC (this is a doc comment too).
|
|
2 401 402 + pub fn unixEpoch() Timestamp {
|
|
2 402 403 + return Timestamp{
|
|
0 403 403 | .seconds = 0,
|
|
0 403 403 | .nanos = 0,
|
|
0 403 402 | };
|
|
0 402 401 | }
|
|
0 401 400 | };
|
|
0 400 400
|
|
2 400 401 + //! This module provides functions for retrieving the current date and
|
|
0 401 401 | //! time with varying degrees of precision and accuracy. It does not
|
|
0 401 400 | //! depend on libc, but will use functions from it if available.
|
|
0 400 400
|
|
2 400 401 + const S = struct {
|
|
2 401 402 + //! Top level comments are allowed inside a container other than a module,
|
|
0 402 402 | //! but it is not very useful. Currently, when producing the package
|
|
0 402 401 | //! documentation, these comments are ignored.
|
|
0 401 400 | };
|
|
0 400 400
|
|
0 400 400 const std = @import("std");
|
|
0 400 400
|
|
2 400 401 + pub fn main() !void {
|
|
0 401 401 | const stdout = std.io.getStdOut().writer();
|
|
0 401 401 | try stdout.print("Hello, {s}!\n", .{"world"});
|
|
0 401 400 | }
|
|
0 400 400
|
|
0 400 400
|
|
0 400 400 // Top-level declarations are order-independent:
|
|
0 400 400 const print = std.debug.print;
|
|
0 400 400 const std = @import("std");
|
|
0 400 400 const os = std.os;
|
|
0 400 400 const assert = std.debug.assert;
|
|
0 400 400
|
|
2 400 401 + pub fn main() void {
|
|
0 401 401 | // integers
|
|
0 401 401 | const one_plus_one: i32 = 1 + 1;
|
|
0 401 401 | print("1 + 1 = {}\n", .{one_plus_one});
|
|
0 401 401 |
|
|
0 401 401 | // floats
|
|
0 401 401 | const seven_div_three: f32 = 7.0 / 3.0;
|
|
0 401 401 | print("7.0 / 3.0 = {}\n", .{seven_div_three});
|
|
0 401 401 |
|
|
0 401 401 | // boolean
|
|
2 401 403 + print("{}\n{}\n{}\n", .{
|
|
0 403 403 | true and false,
|
|
0 403 403 | true or false,
|
|
0 403 403 | !true,
|
|
0 403 401 | });
|
|
0 401 401 |
|
|
0 401 401 | // optional
|
|
0 401 401 | var optional_value: ?[]const u8 = null;
|
|
0 401 401 | assert(optional_value == null);
|
|
0 401 401 |
|
|
2 401 403 + print("\noptional 1\ntype: {}\nvalue: {?s}\n", .{
|
|
0 403 403 | @TypeOf(optional_value), optional_value,
|
|
0 403 401 | });
|
|
0 401 401 |
|
|
0 401 401 | optional_value = "hi";
|
|
0 401 401 | assert(optional_value != null);
|
|
0 401 401 |
|
|
2 401 403 + print("\noptional 2\ntype: {}\nvalue: {?s}\n", .{
|
|
0 403 403 | @TypeOf(optional_value), optional_value,
|
|
0 403 401 | });
|
|
0 401 401 |
|
|
0 401 401 | // error union
|
|
0 401 401 | var number_or_error: anyerror!i32 = error.ArgNotFound;
|
|
0 401 401 |
|
|
2 401 403 + print("\nerror union 1\ntype: {}\nvalue: {!}\n", .{
|
|
0 403 403 | @TypeOf(number_or_error),
|
|
0 403 403 | number_or_error,
|
|
0 403 401 | });
|
|
0 401 401 |
|
|
0 401 401 | number_or_error = 1234;
|
|
0 401 401 |
|
|
2 401 403 + print("\nerror union 2\ntype: {}\nvalue: {!}\n", .{
|
|
0 403 403 | @TypeOf(number_or_error), number_or_error,
|
|
0 403 401 | });
|
|
0 401 400 | }
|
|
0 400 400
|
|
0 400 400 const print = @import("std").debug.print;
|
|
0 400 400 const mem = @import("std").mem; // will be used to compare bytes
|
|
0 400 400
|
|
2 400 401 + pub fn main() void {
|
|
0 401 401 | const bytes = "hello\u{12345678}";
|
|
0 401 401 | print("{}\n", .{@TypeOf(bytes)}); // *const [5:0]u8
|
|
0 401 401 | print("{d}\n", .{bytes.len}); // 5
|
|
0 401 401 | print("{c}\n", .{bytes[1]}); // 'e'
|
|
0 401 401 | print("{d}\n", .{bytes[5]}); // 0
|
|
0 401 401 | print("{}\n", .{'e' == '\x65'}); // true
|
|
0 401 401 | print("{d}\n", .{'\u{1f4a9}'}); // 128169
|
|
0 401 401 | print("{d}\n", .{'💯'}); // 128175
|
|
0 401 401 | print("{u}\n", .{'⚡'});
|
|
0 401 401 | print("{}\n", .{mem.eql(u8, "hello", "h\x65llo")}); // true
|
|
0 401 401 | print("{}\n", .{mem.eql(u8, "💯", "\xf0\x9f\x92\xaf")}); // also true
|
|
0 401 401 | const invalid_utf8 = "\xff\xfe"; // non-UTF-8 strings are possible with \xNN notation.
|
|
0 401 401 | print("0x{x}\n", .{invalid_utf8[1]}); // indexing them returns individual bytes...
|
|
0 401 401 | print("0x{x}\n", .{"💯"[1]}); // ...as does indexing part-way through non-ASCII characters
|
|
0 401 400 | }
|
|
0 400 400
|
|
0 400 400 const hello_world_in_c =
|
|
2 400 401 + \\#include <stdio.h>
|
|
0 401 401 | \\
|
|
0 401 401 | \\int main(int argc, char **argv) {
|
|
0 401 401 | \\ printf("hello world\n");
|
|
0 401 401 | \\ return 0;
|
|
0 401 400 | \\}
|
|
0 400 400 ;
|
|
0 400 400
|
|
0 400 400 const std = @import("std");
|
|
0 400 400 const assert = std.debug.assert;
|
|
0 400 400
|
|
0 400 400 threadlocal var x: i32 = 1234;
|
|
0 400 400
|
|
2 400 401 + test "thread local storage" {
|
|
0 401 401 | const thread1 = try std.Thread.spawn(.{}, testTls, .{});
|
|
0 401 401 | const thread2 = try std.Thread.spawn(.{}, testTls, .{});
|
|
0 401 401 | testTls();
|
|
0 401 401 | thread1.join();
|
|
0 401 401 | thread2.join();
|
|
0 401 400 | }
|
|
0 400 400
|
|
2 400 401 + fn testTls() void {
|
|
0 401 401 | assert(x == 1234);
|
|
0 401 401 | x += 1;
|
|
0 401 401 | assert(x == 1235);
|
|
0 401 400 | }
|
|
0 400 400
|
|
0 400 400 const decimal_int = 98222;
|
|
0 400 400 const hex_int = 0xff;
|
|
0 400 400 const another_hex_int = 0xFF;
|
|
0 400 400 const octal_int = 0o755;
|
|
0 400 400 const binary_int = 0b11110000;
|
|
0 400 400
|
|
0 400 400 // underscores may be placed between two digits as a visual separator
|
|
0 400 400 const one_billion = 1_000_000_000;
|
|
0 400 400 const binary_mask = 0b1_1111_1111;
|
|
0 400 400 const permissions = 0o7_5_5;
|
|
0 400 400 const big_address = 0xFF80_0000_0000_0000;
|
|
0 400 400
|
|
0 400 400
|
|
0 400 400 const floating_point = 123.0E+77;
|
|
0 400 400 const another_float = 123.0;
|
|
0 400 400 const yet_another = 123.0e+77;
|
|
0 400 400
|
|
0 400 400 const hex_floating_point = 0x103.70p-5;
|
|
0 400 400 const another_hex_float = 0x103.70;
|
|
0 400 400 const yet_another_hex_float = 0x103.70P-5;
|
|
0 400 400
|
|
0 400 400 // underscores may be placed between two digits as a visual separator
|
|
0 400 400 const lightspeed = 299_792_458.000_000;
|
|
0 400 400 const nanosecond = 0.000_000_001;
|
|
0 400 400 const more_hex = 0x1234_5678.9ABC_CDEFp-10;
|
|
0 400 400
|
|
2 400 401 + const Vec3 = struct {
|
|
0 401 401 | x: f32,
|
|
0 401 401 | y: f32,
|
|
0 401 401 | z: f32,
|
|
0 401 401 |
|
|
2 401 402 + pub fn init(x: f32, y: f32, z: f32) Vec3 {
|
|
2 402 403 + return Vec3{
|
|
0 403 403 | .x = x,
|
|
0 403 403 | .y = y,
|
|
0 403 403 | .z = z,
|
|
0 403 402 | };
|
|
0 402 401 | }
|
|
0 401 401 |
|
|
2 401 402 + pub fn dot(self: Vec3, other: Vec3) f32 {
|
|
0 402 402 | return self.x * other.x + self.y * other.y + self.z * other.z;
|
|
0 402 401 | }
|
|
0 401 400 | };
|
|
0 400 400
|
|
2 400 401 + fn LinkedList(comptime T: type) type {
|
|
2 401 402 + return struct {
|
|
2 402 403 + pub const Node = struct {
|
|
0 403 403 | prev: ?*Node,
|
|
0 403 403 | next: ?*Node,
|
|
0 403 403 | data: T,
|
|
0 403 402 | };
|
|
0 402 402 |
|
|
0 402 402 | first: ?*Node,
|
|
0 402 402 | last: ?*Node,
|
|
0 402 402 | len: usize,
|
|
0 402 401 | };
|
|
0 401 400 | }
|
|
0 400 400
|
|
2 400 401 + const Point = struct {
|
|
0 401 401 | x: f32,
|
|
0 401 401 | y: f32,
|
|
0 401 400 | };
|
|
0 400 400
|
|
2 400 401 + // Maybe we want to pass it to OpenGL so we want to be particular about
|
|
0 401 400 | // how the bytes are arranged.
|
|
2 400 401 + const Point2 = packed struct {
|
|
0 401 401 | x: f32,
|
|
0 401 401 | y: f32,
|
|
0 401 400 | };
|
|
0 400 400
|
|
0 400 400
|
|
0 400 400 const std = @import("std");
|
|
0 400 400 const expect = std.testing.expect;
|
|
0 400 400
|
|
2 400 401 + const Color = enum {
|
|
0 401 401 | auto,
|
|
0 401 401 | off,
|
|
0 401 401 | on,
|
|
0 401 400 | };
|
|
0 400 400
|
|
0 400 400 const std = @import("std");
|
|
0 400 400 const builtin = @import("builtin");
|
|
0 400 400 const expect = std.testing.expect;
|
|
0 400 400
|
|
2 400 401 + test "switch simple" {
|
|
0 401 401 | const a: u64 = 10;
|
|
0 401 401 | const zz: u64 = 103;
|
|
0 401 401 |
|
|
2 401 402 + // All branches of a switch expression must be able to be coerced to a
|
|
0 402 402 | // common type.
|
|
0 402 402 | //
|
|
0 402 402 | // Branches cannot fallthrough. If fallthrough behavior is desired, combine
|
|
0 402 401 | // the cases and use an if.
|
|
2 401 402 + const b = switch (a) {
|
|
0 402 402 | // Multiple cases can be combined via a ','
|
|
0 402 402 | 1, 2, 3 => 0,
|
|
0 402 402 |
|
|
2 402 403 + // Ranges can be specified using the ... syntax. These are inclusive
|
|
0 403 402 | // of both ends.
|
|
0 402 402 | 5...100 => 1,
|
|
0 402 402 |
|
|
0 402 402 | // Branches can be arbitrarily complex.
|
|
2 402 403 + 101 => blk: {
|
|
0 403 403 | const c: u64 = 5;
|
|
0 403 403 | break :blk c * 2 + 1;
|
|
0 403 402 | },
|
|
0 402 402 |
|
|
2 402 403 + // Switching on arbitrary expressions is allowed as long as the
|
|
0 403 402 | // expression is known at compile-time.
|
|
0 402 402 | zz => zz,
|
|
2 402 403 + blk: {
|
|
0 403 403 | const d: u32 = 5;
|
|
0 403 403 | const e: u32 = 100;
|
|
0 403 403 | break :blk d + e;
|
|
0 403 402 | } => 107,
|
|
0 402 402 |
|
|
2 402 403 + // The else branch catches everything not already captured.
|
|
0 403 403 | // Else branches are mandatory unless the entire range of values
|
|
0 403 402 | // is handled.
|
|
0 402 402 | else => 9,
|
|
0 402 401 | };
|
|
0 401 401 |
|
|
0 401 401 | try expect(b == 1);
|
|
0 401 400 | }
|
|
0 400 400
|
|
2 400 401 + fn charToDigit(c: u8) u8 {
|
|
2 401 402 + return switch (c) {
|
|
0 402 402 | '0'...'9' => c - '0',
|
|
0 402 402 | 'A'...'Z' => c - 'A' + 10,
|
|
0 402 402 | 'a'...'z' => c - 'a' + 10,
|
|
0 402 402 | else => maxInt(u8),
|
|
0 402 401 | };
|
|
0 401 400 | }
|
|
0 400 400
|
|
0 400 400 const optional_value: ?i32 = null;
|
|
0 400 400
|
|
2 400 401 + //! This module provides functions for retrieving the current date and
|
|
0 401 401 | //! time with varying degrees of precision and accuracy. It does not
|
|
0 401 400 | //! depend on libc, but will use functions from it if available.
|
|
0 400 400
|
|
0 400 400 const @"identifier with spaces in it" = 0xff;
|
|
0 400 400 const @"1SmallStep4Man" = 112358;
|
|
0 400 400
|
|
0 400 400 const c = @import("std").c;
|
|
0 400 400 pub extern "c" fn @"error"() void;
|
|
0 400 400 pub extern "c" fn @"fstat$INODE64"(fd: c.fd_t, buf: *c.Stat) c_int;
|
|
0 400 400
|
|
2 400 401 + const Color = enum {
|
|
0 401 401 | red,
|
|
0 401 401 | @"really red",
|
|
0 401 400 | };
|
|
0 400 400 const color: Color = .@"really red";
|
|
0 400 400
|
|
0 400 400 const s1 = "Unterminated string
|
|
0 400 400 const s2 = 'Unterminated character
|
|
0 400 400 const s3 = @"Unterminated identifier string
|
|
0 400 0 |